Compare commits
1301 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6378ba0f98 | ||
|
|
2c8136dcf3 | ||
|
|
3315e1d4b6 | ||
|
|
37fb5c90d5 | ||
|
|
ff994a7c95 | ||
|
|
a2275758b1 | ||
|
|
783250d99a | ||
|
|
19057c7e81 | ||
|
|
9dfb8727dc | ||
|
|
bef7bcfa8f | ||
|
|
d9d8eaafcd | ||
|
|
f055cd5573 | ||
|
|
aee8fab832 | ||
|
|
a72cbe4bd9 | ||
|
|
ea09e8161c | ||
|
|
f051fa9507 | ||
|
|
04a657252f | ||
|
|
fc6f18fea9 | ||
|
|
8c60320532 | ||
|
|
34709b0f8f | ||
|
|
b2cfffc5d5 | ||
|
|
89329de198 | ||
|
|
70dda16699 | ||
|
|
db0b1f6cfc | ||
|
|
c153990c52 | ||
|
|
42d6e06a48 | ||
|
|
2db123a386 | ||
|
|
45f0d387fd | ||
|
|
7f9c58aabe | ||
|
|
3ce84b89b4 | ||
|
|
1dd4f8167e | ||
|
|
117b344857 | ||
|
|
0d5b6b1529 | ||
|
|
535be2cff3 | ||
|
|
1a67eb2000 | ||
|
|
e8ef9c0932 | ||
|
|
81f165c9d0 | ||
|
|
25011d1798 | ||
|
|
e773b82218 | ||
|
|
04ee3a0c48 | ||
|
|
10b5a6c96c | ||
|
|
3aca1d46c2 | ||
|
|
db55471111 | ||
|
|
112262d7d6 | ||
|
|
a1b9b7af86 | ||
|
|
e3540a1dd6 | ||
|
|
cd97d184ce | ||
|
|
929c56b079 | ||
|
|
388b65696f | ||
|
|
ba9089e2ac | ||
|
|
20d0061d42 | ||
|
|
4bef7cdafd | ||
|
|
bf728972b5 | ||
|
|
dfd2a82b42 | ||
|
|
c4bb3bea28 | ||
|
|
006dd44c64 | ||
|
|
698935d06f | ||
|
|
564c7ccac4 | ||
|
|
2b5556410d | ||
|
|
ee7c8ce97f | ||
|
|
17f7482080 | ||
|
|
6d137ad51c | ||
|
|
6c004812a9 | ||
|
|
d932559849 | ||
|
|
c3c40fdc27 | ||
|
|
41262e0317 | ||
|
|
2a1ecfd9e2 | ||
|
|
20833213b1 | ||
|
|
81159983cf | ||
|
|
bc35785c9c | ||
|
|
041ca943c9 | ||
|
|
312861a933 | ||
|
|
96657de512 | ||
|
|
4ad11593d5 | ||
|
|
d851ab58bc | ||
|
|
c08e050815 | ||
|
|
4aeecf6a97 | ||
|
|
1caa7ebfdd | ||
|
|
8666a0c58b | ||
|
|
99bc711954 | ||
|
|
627d7f9b40 | ||
|
|
8a5bf21982 | ||
|
|
2433aacfbc | ||
|
|
ba29f5ee8e | ||
|
|
eb784a982f | ||
|
|
2173a36564 | ||
|
|
ee079a8aa8 | ||
|
|
b4aba1a02a | ||
|
|
32baffe636 | ||
|
|
19fb39b02f | ||
|
|
bc7fef05f6 | ||
|
|
4d8b72e33a | ||
|
|
cf0059fe66 | ||
|
|
d7e5df569a | ||
|
|
cd46a3b0dc | ||
|
|
3486b97aee | ||
|
|
dc6e326122 | ||
|
|
4459b70271 | ||
|
|
57dece449c | ||
|
|
5e7368ebcf | ||
|
|
cbdd4bd99e | ||
|
|
d0cc62f8c0 | ||
|
|
0c2c0c9e20 | ||
|
|
274addb069 | ||
|
|
5c3a93c49b | ||
|
|
36ac1370d7 | ||
|
|
3eb402ae08 | ||
|
|
07589370df | ||
|
|
8220466f03 | ||
|
|
5c57b9cb58 | ||
|
|
a72515bc30 | ||
|
|
e79b8c6449 | ||
|
|
e63f9e7359 | ||
|
|
d0f3ffa93a | ||
|
|
37874aff3a | ||
|
|
44ff9d4ac6 | ||
|
|
5e8f979d05 | ||
|
|
ae15e1983f | ||
|
|
28513100f4 | ||
|
|
e72e82ea55 | ||
|
|
47bf7ab59b | ||
|
|
4ee42f38b9 | ||
|
|
60dd90a9ed | ||
|
|
3f979aef05 | ||
|
|
4bb808b341 | ||
|
|
887478c751 | ||
|
|
2708dead53 | ||
|
|
644f1da871 | ||
|
|
e32c73cdb2 | ||
|
|
40c3d84efc | ||
|
|
760a0cb85d | ||
|
|
0f8774a37c | ||
|
|
fa659ff115 | ||
|
|
fdfe591c39 | ||
|
|
7aae88ce85 | ||
|
|
8fbc02bfff | ||
|
|
0e4c8760f8 | ||
|
|
320dba9d9c | ||
|
|
6ddf78d2b0 | ||
|
|
79e66226b0 | ||
|
|
500118d787 | ||
|
|
ade4ffcad4 | ||
|
|
08b71604ec | ||
|
|
e731e9cea0 | ||
|
|
980b4e8e9f | ||
|
|
8158f3058f | ||
|
|
eea49b7943 | ||
|
|
5e8067ad72 | ||
|
|
e85ed55598 | ||
|
|
7f6c702683 | ||
|
|
e6d05cc4aa | ||
|
|
4ebc700283 | ||
|
|
121d099402 | ||
|
|
54668820b1 | ||
|
|
d63108dea1 | ||
|
|
5cdc4b08b3 | ||
|
|
dd11f467fa | ||
|
|
49b13e6689 | ||
|
|
b9d0d9f03b | ||
|
|
0972f3fcff | ||
|
|
d251c7655d | ||
|
|
afbdad43db | ||
|
|
886a382f57 | ||
|
|
c1c37f5716 | ||
|
|
89957190c7 | ||
|
|
0167919542 | ||
|
|
b3ccf3bb8f | ||
|
|
d434680f0e | ||
|
|
53c86a79d0 | ||
|
|
f7b851d295 | ||
|
|
baf0000a3f | ||
|
|
5b50a36a60 | ||
|
|
45f911cef9 | ||
|
|
aa3efd6015 | ||
|
|
fd21a5b86f | ||
|
|
d1744b07ec | ||
|
|
10aa59d65d | ||
|
|
2506b6115c | ||
|
|
acfc282e25 | ||
|
|
ffb24b8cd6 | ||
|
|
d4c70fba00 | ||
|
|
7b14c16af1 | ||
|
|
fc466f6087 | ||
|
|
1e8ce1d6d9 | ||
|
|
589e06dc00 | ||
|
|
7936c3e275 | ||
|
|
5e946cdfa7 | ||
|
|
b53b94e27d | ||
|
|
6f8db74159 | ||
|
|
43b086f3ea | ||
|
|
e28da750c7 | ||
|
|
55036bf581 | ||
|
|
27633cef7a | ||
|
|
23aa158cc2 | ||
|
|
25889577c8 | ||
|
|
bcb4246ee9 | ||
|
|
a5902305d0 | ||
|
|
4647e75733 | ||
|
|
2e07d526a8 | ||
|
|
d9c3f12ee6 | ||
|
|
f5c2ea3ba4 | ||
|
|
c2c998e48c | ||
|
|
1c1eee8e3a | ||
|
|
8e081e6968 | ||
|
|
15e75c286c | ||
|
|
f227093c95 | ||
|
|
a38b09d1a8 | ||
|
|
4b0e651cf5 | ||
|
|
105bd1ce4b | ||
|
|
0f6efabeb3 | ||
|
|
22f6e3c8b2 | ||
|
|
5fa1526f1e | ||
|
|
6eed0f3635 | ||
|
|
4e9c4cea0f | ||
|
|
548956d403 | ||
|
|
159dea6573 | ||
|
|
5bcc3f7e53 | ||
|
|
188fda91ce | ||
|
|
573b2e2c74 | ||
|
|
0cf3f27a13 | ||
|
|
8c8b7aa7c5 | ||
|
|
10cf04e05c | ||
|
|
1b87f62b36 | ||
|
|
c8183fd3c1 | ||
|
|
e087b81655 | ||
|
|
2a671842e4 | ||
|
|
b1aa7bf42c | ||
|
|
fcbf2ba979 | ||
|
|
b8864ded0c | ||
|
|
f644002c79 | ||
|
|
891e05c400 | ||
|
|
686dec7727 | ||
|
|
1b8df943d5 | ||
|
|
2df46f1396 | ||
|
|
825cc9c5f9 | ||
|
|
12a13c5264 | ||
|
|
ee2e5e81e0 | ||
|
|
a95d2de9bd | ||
|
|
6035400e96 | ||
|
|
4178621b2c | ||
|
|
46167baf92 | ||
|
|
94e49a4cc3 | ||
|
|
7d15d60b32 | ||
|
|
b79ccac892 | ||
|
|
9f51a2cf4e | ||
|
|
138b811314 | ||
|
|
e351e5c0df | ||
|
|
52f86c4f86 | ||
|
|
db0ba8cc40 | ||
|
|
fbd8805b84 | ||
|
|
d5a4c019cb | ||
|
|
b6e71ac865 | ||
|
|
850074ee7e | ||
|
|
bb052decae | ||
|
|
977d53d696 | ||
|
|
9b88a601c5 | ||
|
|
cb9a650bc4 | ||
|
|
57e66642ef | ||
|
|
155fe5f011 | ||
|
|
bfc9b989ef | ||
|
|
5e50138d8e | ||
|
|
3430423749 | ||
|
|
fa4a97a2cb | ||
|
|
47b585062b | ||
|
|
39c5214075 | ||
|
|
0a25a32fc8 | ||
|
|
3c429a71c8 | ||
|
|
fcdcfd2757 | ||
|
|
fe5f643906 | ||
|
|
f9cbc43110 | ||
|
|
23c85c1539 | ||
|
|
644cd75522 | ||
|
|
8647063b4b | ||
|
|
1cb38ba9dd | ||
|
|
ea2f303ea4 | ||
|
|
7cc687814f | ||
|
|
51d68b5c03 | ||
|
|
992d748a2a | ||
|
|
047e543d8d | ||
|
|
6befc5faa7 | ||
|
|
3a54b20f84 | ||
|
|
14e9435684 | ||
|
|
8a7dccc784 | ||
|
|
7e027680ab | ||
|
|
ddbd98127e | ||
|
|
65818ab063 | ||
|
|
f2dda625f4 | ||
|
|
adfc1b3cec | ||
|
|
5c00c22b5e | ||
|
|
e34f5f67f5 | ||
|
|
afea3ac60f | ||
|
|
a0fe45dff7 | ||
|
|
48a8623aa2 | ||
|
|
80c3eaa30a | ||
|
|
b2d5747a11 | ||
|
|
4a5a3ffaf0 | ||
|
|
941847d460 | ||
|
|
7cd4c0a9b7 | ||
|
|
c5f18bbf50 | ||
|
|
31245457cd | ||
|
|
831561b83b | ||
|
|
05b64f94e2 | ||
|
|
5d4ec11af8 | ||
|
|
bbb0e006e7 | ||
|
|
8f1c91827c | ||
|
|
3ee55149fa | ||
|
|
05d63fe6eb | ||
|
|
6fd0f35934 | ||
|
|
ea18cf2fba | ||
|
|
aa8f184b38 | ||
|
|
5f9ebc3b13 | ||
|
|
9210cae2db | ||
|
|
950c547045 | ||
|
|
ed8a60aa53 | ||
|
|
68f8059745 | ||
|
|
f14a0c6343 | ||
|
|
c00b21cfda | ||
|
|
a3b3793fcd | ||
|
|
a5bd5417b7 | ||
|
|
addbfde055 | ||
|
|
ff928b6257 | ||
|
|
eb8b67a11f | ||
|
|
fde792e56c | ||
|
|
a4d0a5d942 | ||
|
|
2a980a39f4 | ||
|
|
67cffeb4af | ||
|
|
417f451ec9 | ||
|
|
1e485014f6 | ||
|
|
e0691aa1b3 | ||
|
|
c863a96214 | ||
|
|
01de1b5b5e | ||
|
|
72f7a13897 | ||
|
|
e2465c98fa | ||
|
|
ad5181f22e | ||
|
|
a12c566fbd | ||
|
|
b692ba87f8 | ||
|
|
bea0c2cf78 | ||
|
|
df3e59e5c6 | ||
|
|
6e9006838d | ||
|
|
ef7a47ebb9 | ||
|
|
727c7a0dca | ||
|
|
5a8b93b5f7 | ||
|
|
06e12225b2 | ||
|
|
059f58842e | ||
|
|
ce792474c6 | ||
|
|
0dee937f07 | ||
|
|
ea4d784182 | ||
|
|
446703e9f3 | ||
|
|
28f3b83695 | ||
|
|
1450b8e2c8 | ||
|
|
73f0dd4dd6 | ||
|
|
900de88ddd | ||
|
|
25e7016486 | ||
|
|
b79b65ea6c | ||
|
|
f864c227de | ||
|
|
559c02afb1 | ||
|
|
ac667c2862 | ||
|
|
02d5e88a4e | ||
|
|
16a321c27b | ||
|
|
bd801d3235 | ||
|
|
3dcf833035 | ||
|
|
de6e7ad732 | ||
|
|
18b1e37cee | ||
|
|
e8e86186e7 | ||
|
|
2573616612 | ||
|
|
8d1dacb334 | ||
|
|
06ea38fa5f | ||
|
|
ee0419578e | ||
|
|
2210f41337 | ||
|
|
106fd2514b | ||
|
|
1ac775c224 | ||
|
|
4464943dd0 | ||
|
|
c572f061e3 | ||
|
|
c8a1e401c8 | ||
|
|
117e82765c | ||
|
|
c37ac7e120 | ||
|
|
2043335042 | ||
|
|
ac9c5f8666 | ||
|
|
ca11e59ae1 | ||
|
|
83203bf43a | ||
|
|
b2a4aca049 | ||
|
|
73bbd87bfb | ||
|
|
08cc816fb6 | ||
|
|
a2cd9a4e55 | ||
|
|
4b8a080ed5 | ||
|
|
9d0e2225a3 | ||
|
|
39dabbaeb5 | ||
|
|
33667ede21 | ||
|
|
f068c6b2d1 | ||
|
|
b29998bcbc | ||
|
|
9619b74695 | ||
|
|
7d7e19cdce | ||
|
|
c77a95addf | ||
|
|
a87bec22d0 | ||
|
|
340dce7ed7 | ||
|
|
d52edb9481 | ||
|
|
5932192d92 | ||
|
|
211e44f804 | ||
|
|
bc281e3512 | ||
|
|
3101cca619 | ||
|
|
a9edbe6838 | ||
|
|
a227b8ec29 | ||
|
|
0976794aa2 | ||
|
|
b24f55e4b4 | ||
|
|
ef5ae2e161 | ||
|
|
e546c5241d | ||
|
|
e3f668fdc8 | ||
|
|
0956f5a4a9 | ||
|
|
935529562a | ||
|
|
ad3dce4922 | ||
|
|
a29e72f5cc | ||
|
|
0c33c1e070 | ||
|
|
5300254a6d | ||
|
|
d16c625991 | ||
|
|
dd46a02626 | ||
|
|
03d28479c4 | ||
|
|
7398753351 | ||
|
|
16a805e853 | ||
|
|
e1bb30c768 | ||
|
|
32c4c7e57b | ||
|
|
ae59500b1e | ||
|
|
69de63648f | ||
|
|
50ce815ac1 | ||
|
|
3c7302c857 | ||
|
|
3e9d9e3769 | ||
|
|
3f8ea222e1 | ||
|
|
1376a92020 | ||
|
|
f12432dfc5 | ||
|
|
796b6fab92 | ||
|
|
cf6e008502 | ||
|
|
426ca5ebb2 | ||
|
|
345cbbe22c | ||
|
|
b319abbabb | ||
|
|
85711db4d5 | ||
|
|
3e6613f955 | ||
|
|
69e888c6d4 | ||
|
|
e830ededf2 | ||
|
|
d089419cfb | ||
|
|
f7c85fc24e | ||
|
|
5d380f1a68 | ||
|
|
a048bea26e | ||
|
|
dc98c7dd63 | ||
|
|
6a188e1983 | ||
|
|
704f52392f | ||
|
|
5fa6f2c9ef | ||
|
|
2cba48afa9 | ||
|
|
ec457b24b7 | ||
|
|
50babb212f | ||
|
|
a1e98090a8 | ||
|
|
f9764b6819 | ||
|
|
99343fee34 | ||
|
|
1474f6af74 | ||
|
|
d37ebeff3c | ||
|
|
2c3f507c03 | ||
|
|
d9c8e380f2 | ||
|
|
876dd3fbe8 | ||
|
|
e56ed2f0aa | ||
|
|
7cc75c56ae | ||
|
|
bf71037516 | ||
|
|
0289eb35a2 | ||
|
|
d4e46594c4 | ||
|
|
5c6b22c122 | ||
|
|
cf278e0fd6 | ||
|
|
d4ce908394 | ||
|
|
bd391bacec | ||
|
|
adbe57e709 | ||
|
|
dd5271a40b | ||
|
|
38b22bce38 | ||
|
|
ff4d48704f | ||
|
|
0933a874dc | ||
|
|
14ac13551b | ||
|
|
90be8d5730 | ||
|
|
6814113cbf | ||
|
|
65bfa9eeec | ||
|
|
3f3c384f9a | ||
|
|
73d76a000d | ||
|
|
e9ec75219a | ||
|
|
50029c6b07 | ||
|
|
40fc1166ba | ||
|
|
dd5f0f94b5 | ||
|
|
1a770820cf | ||
|
|
93c5058afa | ||
|
|
3ac83aa7fe | ||
|
|
16aabd5da0 | ||
|
|
6d925bb15b | ||
|
|
23afbc7ece | ||
|
|
81727e0f52 | ||
|
|
976dab7566 | ||
|
|
05bf9e2af0 | ||
|
|
d813fb10e1 | ||
|
|
4a05b9e903 | ||
|
|
42ed13e0ef | ||
|
|
74872076e4 | ||
|
|
cc28ace415 | ||
|
|
e52fd8243f | ||
|
|
1aeb96f8b5 | ||
|
|
14d6052c4e | ||
|
|
f1f345707a | ||
|
|
0bca2e2bf2 | ||
|
|
dd7df6f898 | ||
|
|
5c7c4ce739 | ||
|
|
cf45ac7cbe | ||
|
|
107726efe7 | ||
|
|
3ba43b8579 | ||
|
|
fe3b1bebce | ||
|
|
ad3ef0883b | ||
|
|
8d696cd51a | ||
|
|
e12114c3e4 | ||
|
|
16c799e512 | ||
|
|
ef035b76c0 | ||
|
|
4cec4f2e42 | ||
|
|
5a6cf46f9e | ||
|
|
68bca67899 | ||
|
|
5c4eb4eebb | ||
|
|
b8dbda153e | ||
|
|
97109250c9 | ||
|
|
3c5e4a7df6 | ||
|
|
e55184591c | ||
|
|
f928cf1d76 | ||
|
|
bfc515f3ed | ||
|
|
e968cefe0d | ||
|
|
8c08b46c8f | ||
|
|
f65b9bec23 | ||
|
|
d51f9f902c | ||
|
|
9a6223ac26 | ||
|
|
2efcf7d85c | ||
|
|
025cb3d5b8 | ||
|
|
85644362a9 | ||
|
|
33162704e8 | ||
|
|
25735d205f | ||
|
|
5389cd1d3a | ||
|
|
2793e397b0 | ||
|
|
476106a58c | ||
|
|
f253d0c14c | ||
|
|
cc500bfcac | ||
|
|
03b0ba4ac0 | ||
|
|
f6bae680af | ||
|
|
2759fdc8d9 | ||
|
|
e08130132f | ||
|
|
222ada0f0c | ||
|
|
e6b6ad6e2c | ||
|
|
7fd77dde57 | ||
|
|
b8a492e842 | ||
|
|
fbabb2efaa | ||
|
|
2a475a9ea7 | ||
|
|
ecbeb15d2f | ||
|
|
6102205900 | ||
|
|
a8be1591c3 | ||
|
|
94fc66a48f | ||
|
|
88bd409d42 | ||
|
|
222cbd8df8 | ||
|
|
77189701d6 | ||
|
|
3d7da22ac0 | ||
|
|
18ec35f272 | ||
|
|
7766d127e0 | ||
|
|
9d29cb3540 | ||
|
|
009cdf2955 | ||
|
|
2045da36d8 | ||
|
|
dfa364cdd8 | ||
|
|
d068593177 | ||
|
|
058fe71173 | ||
|
|
cb05fa3178 | ||
|
|
fb77198ca3 | ||
|
|
7e6482f095 | ||
|
|
42f4a27c54 | ||
|
|
e4cec2a9a2 | ||
|
|
7c6f50265c | ||
|
|
49d1b1ef75 | ||
|
|
410fd6c991 | ||
|
|
fbb8af6fc2 | ||
|
|
28295f5b85 | ||
|
|
61c5690e38 | ||
|
|
fa921add45 | ||
|
|
e19d5af09a | ||
|
|
21a3f560e9 | ||
|
|
d924454547 | ||
|
|
f626aeecfe | ||
|
|
f567e3da40 | ||
|
|
968adae26f | ||
| e328852ffe | |||
|
|
25a652621d | ||
|
|
a846c22479 | ||
|
|
3318e1c91a | ||
|
|
4c4f3dd70b | ||
|
|
8586745b82 | ||
| 64e615760c | |||
|
|
6a159a9015 | ||
|
|
2cb2b7981c | ||
| 05557433d0 | |||
|
|
d2805bdb2f | ||
|
|
7269d2e954 | ||
|
|
776bff338f | ||
|
|
27ef923c27 | ||
|
|
295b2fa183 | ||
|
|
259f63917e | ||
|
|
3b3765a53f | ||
|
|
5a4c8ab3a4 | ||
|
|
90249b83e1 | ||
| 571e19f11c | |||
|
|
51bc603fe7 | ||
|
|
c860daa1d5 | ||
| c6b9003429 | |||
|
|
c4ce75789d | ||
|
|
874d101b21 | ||
|
|
ffd8f72c74 | ||
|
|
2d99b6ab7a | ||
|
|
7ba4b4b2b4 | ||
|
|
30e41c1cab | ||
| ee5c6207bd | |||
|
|
b35a33587b | ||
|
|
05dfaf2c83 | ||
|
|
4ef7c01e29 | ||
| 30178c5179 | |||
|
|
50367edca4 | ||
|
|
5afcc52063 | ||
| 728dacf936 | |||
|
|
fc4d668e6f | ||
|
|
36a8b0bb15 | ||
| 7ad38849f2 | |||
|
|
7c6059d479 | ||
|
|
8fc5f6ec0b | ||
|
|
ac326c0a49 | ||
| 3ab59dfbdc | |||
| 23e117279f | |||
|
|
a5e9f5df0a | ||
|
|
441e2319b1 | ||
|
|
8f2555c0a0 | ||
|
|
e4ca3d7987 | ||
| 2cc70d9163 | |||
|
|
e650cda8fc | ||
|
|
821324e8a1 | ||
|
|
28d579d65d | ||
|
|
1b32105603 | ||
|
|
80c6c82ad1 | ||
|
|
7c4a2659dd | ||
|
|
97ad08bc56 | ||
|
|
ac431a3c3c | ||
|
|
165042db38 | ||
|
|
9e2a9b32d8 | ||
|
|
075567f84c | ||
|
|
c23a8f8c29 | ||
|
|
b260151f4c | ||
|
|
37959a9dae | ||
|
|
41cae8b8f4 | ||
|
|
c17541dbc8 | ||
|
|
a200c1ec52 | ||
|
|
d6e1586b4b | ||
|
|
a7cd063be9 | ||
|
|
9e6ae1f5ad | ||
|
|
108c30e4e1 | ||
|
|
7e5d336469 | ||
|
|
561bf7237e | ||
|
|
9bdbd77f73 | ||
|
|
d5311a944d | ||
|
|
d8f0996184 | ||
|
|
56bb085ed5 | ||
|
|
33cbf385e6 | ||
|
|
a7f2115b56 | ||
|
|
115baf7552 | ||
|
|
8da0880819 | ||
|
|
ad3d3e900d | ||
|
|
cae62db0df | ||
|
|
b9d6e5a95b | ||
|
|
92d0aff9f8 | ||
|
|
d746f53941 | ||
|
|
18cbb0bbc5 | ||
|
|
b8a84bb7e1 | ||
|
|
32de93ef9f | ||
|
|
541ea8e94c | ||
|
|
edb5a65fbf | ||
|
|
a43c65e4c2 | ||
|
|
44a1424349 | ||
|
|
99fb76c5bc | ||
|
|
76209b31b5 | ||
|
|
74701c092d | ||
|
|
81e4ccca3c | ||
|
|
201003e020 | ||
|
|
0c6a4d65dc | ||
|
|
152718526b | ||
|
|
dffaadda3b | ||
|
|
84932aa6f2 | ||
|
|
a1282fbdca | ||
|
|
ebcf0a9a5a | ||
|
|
ef76bb2654 | ||
|
|
09edabffdd | ||
|
|
c0b125b481 | ||
|
|
4c3d39a7ae | ||
|
|
91464d92fe | ||
|
|
0f6ce6ef4a | ||
|
|
348df64afc | ||
|
|
0fa1563cf3 | ||
|
|
c29f73cbce | ||
|
|
dbfbf126bb | ||
|
|
1bfa6e942d | ||
|
|
83778741a2 | ||
|
|
b18c25819e | ||
|
|
2d9cd4e1cb | ||
|
|
84a212a505 | ||
|
|
e00825320c | ||
|
|
c560a015b4 | ||
|
|
df6f7c7fd0 | ||
|
|
c0aafdd827 | ||
|
|
833af13491 | ||
|
|
ea4ecd26c5 | ||
|
|
dc6b9f0b21 | ||
|
|
ff3565f735 | ||
|
|
850534f1e2 | ||
|
|
575ea3fdce | ||
|
|
15c5ccbf39 | ||
|
|
b46f791ab2 | ||
|
|
5203033ba5 | ||
|
|
aa75b70c52 | ||
|
|
771cc4cb98 | ||
|
|
8ddf7c9abe | ||
|
|
7558d1a574 | ||
|
|
6e6611c02c | ||
|
|
fde505a5b2 | ||
|
|
b2b8c0e9cd | ||
|
|
a4ca00c88b | ||
|
|
edbe452f8b | ||
|
|
6d4d172ccf | ||
|
|
5211f9a337 | ||
|
|
9a25aaed8c | ||
|
|
9db44f8855 | ||
|
|
2aa9267c12 | ||
|
|
86e6e5e7bf | ||
|
|
0dd375494e | ||
|
|
51203e987e | ||
|
|
d101db1043 | ||
|
|
27be516a67 | ||
|
|
60b2fac278 | ||
|
|
a60a8c7ec4 | ||
|
|
88a74597fa | ||
|
|
9cb50c4110 | ||
|
|
04eba570e5 | ||
|
|
08c296fd50 | ||
|
|
0a38319d98 | ||
|
|
7c9b73b2bc | ||
|
|
4ac772ced4 | ||
|
|
73255420f1 | ||
|
|
b2d4806036 | ||
|
|
532d48c66f | ||
|
|
f7f4adc6b0 | ||
|
|
6f182e7229 | ||
|
|
6cd79cce8b | ||
|
|
e794d3babc | ||
|
|
4d5d2625e5 | ||
|
|
0b56403436 | ||
|
|
578537704a | ||
|
|
e6adcd8185 | ||
|
|
669c9a0ae4 | ||
|
|
972c1b5fd8 | ||
|
|
b852587ace | ||
|
|
b0eab49755 | ||
|
|
1e2b6f21ae | ||
|
|
a37a65f3d7 | ||
|
|
47bf238196 | ||
|
|
f8bd3836db | ||
|
|
144a31a960 | ||
|
|
1d0aff2893 | ||
|
|
76c1a74c3a | ||
|
|
65f3c60ae9 | ||
|
|
eff324614d | ||
|
|
f198fff803 | ||
|
|
7b60a8413e | ||
|
|
5e7cdcd164 | ||
|
|
090bb618b1 | ||
|
|
c3809ca06d | ||
|
|
0f4a0a12ee | ||
|
|
8db7e5d654 | ||
|
|
6289a752e0 | ||
|
|
c1b573a275 | ||
|
|
e84bce7034 | ||
|
|
9c5c91ae9c | ||
|
|
a74f5bff5f | ||
|
|
029260bcef | ||
|
|
92ac480c9b | ||
|
|
fcc53a7111 | ||
|
|
a74f3a1865 | ||
|
|
e4f48dbc40 | ||
|
|
a22addeb50 | ||
|
|
f4721bdf29 | ||
|
|
b7767fbc92 | ||
|
|
76d9de791d | ||
|
|
b3f30f1a0b | ||
|
|
0d1d1f58b2 | ||
|
|
ec247a70ab | ||
|
|
ee52f70633 | ||
|
|
002882fe2f | ||
|
|
d665a17ded | ||
|
|
cd1185a559 | ||
|
|
8a69970542 | ||
|
|
64ba6cf71e | ||
|
|
b2287838b7 | ||
|
|
fc5f02de43 | ||
|
|
08de0eeb00 | ||
|
|
7156e4ba64 | ||
|
|
0a5afe39e0 | ||
|
|
cba3dee0b4 | ||
|
|
1dc7ee3724 | ||
|
|
f9b20bc18b | ||
|
|
f490d337a4 | ||
|
|
bf982a3990 | ||
|
|
d84c292e9b | ||
|
|
cbf5d8a983 | ||
|
|
0d54a2590f | ||
|
|
f84fa70087 | ||
|
|
1d8a7180ab | ||
|
|
d21c198f4a | ||
|
|
3e0c43420e | ||
|
|
cfa8c3eb8a | ||
|
|
d97e0bea38 | ||
|
|
5352687713 | ||
|
|
1e6f12d3a4 | ||
|
|
5b21243f3b | ||
|
|
345fe30710 | ||
|
|
7970bde74b | ||
|
|
81be786844 | ||
|
|
483c69e8f1 | ||
|
|
848f103631 | ||
|
|
800d0c2496 | ||
|
|
e933daaa41 | ||
|
|
2230a2349e | ||
|
|
676619f5df | ||
|
|
f05051c4c8 | ||
|
|
abd218739d | ||
|
|
cfc2585fa4 | ||
|
|
3ee901e3b0 | ||
|
|
2ae41c33cd | ||
|
|
5dc194c97a | ||
|
|
6066e1ee91 | ||
|
|
d14363d27c | ||
|
|
5a296ed6ed | ||
|
|
72806d8a4f | ||
|
|
2612082454 | ||
|
|
dfc5c73695 | ||
|
|
7766d92f99 | ||
|
|
418d6858af | ||
|
|
4e89280a23 | ||
|
|
b9bf8bbee9 | ||
|
|
2bd165a952 | ||
|
|
f60a4c558e | ||
|
|
fa0a864a10 | ||
|
|
ea4d5bde64 | ||
|
|
637b894b49 | ||
|
|
21d1b6cd56 | ||
|
|
86ad165caa | ||
|
|
c02c0cacc4 | ||
|
|
785f9bf1d9 | ||
|
|
b52abe7773 | ||
|
|
c3362821c3 | ||
|
|
371de00add | ||
|
|
ac622759f9 | ||
|
|
e5fee57d0b | ||
|
|
121b5df9df | ||
|
|
837f9fc098 | ||
|
|
970ecff9dc | ||
|
|
3dee218090 | ||
|
|
44197cb2b5 | ||
|
|
e62524e683 | ||
|
|
026eb1115b | ||
|
|
516fd580e2 | ||
|
|
9a24751f65 | ||
|
|
934be4dc71 | ||
|
|
ce3fcd39b0 | ||
|
|
2005f546c5 | ||
|
|
722b6d0e72 | ||
|
|
37eb6ac929 | ||
|
|
8e2a241671 | ||
|
|
df4b6ad545 | ||
|
|
78184094f6 | ||
|
|
198ad87ea2 | ||
|
|
b70b3b730f | ||
|
|
daedd5321b | ||
|
|
66b8a9053b | ||
|
|
66d0226d55 | ||
|
|
407306e085 | ||
|
|
decca9be29 | ||
|
|
b329b0d6f2 | ||
|
|
b4ca344d0f | ||
|
|
de3d8791bb | ||
|
|
6941895b0e | ||
|
|
9fcede4dc6 | ||
|
|
b06016aa41 | ||
|
|
7298bc8b19 | ||
|
|
092ecba7f1 | ||
|
|
7c55d7624e | ||
|
|
c15e08e7c5 | ||
|
|
98f6e9cf3c | ||
|
|
6e64109077 | ||
|
|
5738269bff | ||
|
|
f9f9f455ed | ||
|
|
baeb38c47d | ||
|
|
cf75f63c20 | ||
|
|
5893050e84 | ||
|
|
017d6a85b8 | ||
|
|
27269e1b46 | ||
|
|
163eee5b8c | ||
|
|
f3da3ad7f8 | ||
|
|
b20baafe0f | ||
|
|
7dfda9ffb6 | ||
|
|
1ecc82b243 | ||
|
|
78635b6295 | ||
|
|
d1668cf044 | ||
|
|
97cb88371e | ||
|
|
b8f8a3f2bf | ||
|
|
310fdff0ed | ||
|
|
889251a931 | ||
|
|
1dbd45a27d | ||
|
|
afe0563361 | ||
|
|
d465a3ea7d | ||
|
|
2f2de48607 | ||
|
|
50d9b39f07 | ||
|
|
6d9f5f6d28 | ||
|
|
c90535b5ba | ||
|
|
bbe44ff3fa | ||
|
|
fb59e0830c | ||
|
|
8ddbb8c63c | ||
|
|
886e75da82 | ||
|
|
ab21e31633 | ||
|
|
f358d3ea9e | ||
|
|
069cf18a8b | ||
|
|
65a13f383a | ||
|
|
41b6f96ef7 | ||
|
|
87b3337502 | ||
|
|
ba029a89a6 | ||
|
|
f5ef883a0d | ||
|
|
e5d4874af1 | ||
|
|
8dde09bcfa | ||
|
|
c1a62a147a | ||
|
|
72837004d7 | ||
|
|
5a0564acfb | ||
|
|
32f62e4d24 | ||
|
|
8c46123853 | ||
|
|
efba1aa953 | ||
|
|
0d4b6270ec | ||
|
|
25e45a458e | ||
|
|
b62b15839f | ||
|
|
c0bf6d6be0 | ||
|
|
f22bdd9d9c | ||
|
|
b52fa5db7a | ||
|
|
15651f889b | ||
|
|
aa4a3405c1 | ||
|
|
01408bbac3 | ||
|
|
145b677dbc | ||
|
|
46fad96f7a | ||
|
|
639bdfed98 | ||
|
|
4b9685f14c | ||
|
|
5fde58d00c | ||
|
|
a9d9173208 | ||
|
|
c71dcdbdf5 | ||
|
|
f155dd6ff4 | ||
|
|
e05e8b8b48 | ||
|
|
5bc4d54f3d | ||
|
|
3598a2d0eb | ||
|
|
575e794e44 | ||
|
|
f3faa6b0ab | ||
|
|
f5119e188a | ||
|
|
4bc8346f77 | ||
|
|
ad92a6512f | ||
|
|
95ccb98d99 | ||
|
|
7bf13b78b3 | ||
|
|
43226a2e93 | ||
|
|
2c3b5c998e | ||
|
|
409718d96a | ||
|
|
3522bab943 | ||
|
|
b9f2e5dcf4 | ||
|
|
f91969f95a | ||
|
|
cec2214e01 | ||
|
|
8cc0f32410 | ||
|
|
95e21148bc | ||
|
|
76400bc43f | ||
|
|
b426d91fc7 | ||
|
|
5744dffe90 | ||
|
|
fdf79f9be0 | ||
|
|
879d36b740 | ||
|
|
a51900d82a | ||
|
|
90fb197b94 | ||
|
|
f23f119d0d | ||
|
|
ea5f8dd335 | ||
| a416dfcf9c | |||
|
|
f7f59dbfab | ||
|
|
7553b7d4b6 | ||
|
|
c1929e5db5 | ||
|
|
27e53431d0 | ||
|
|
85d256c6b5 | ||
|
|
33acb29e55 | ||
|
|
eaffe2805f | ||
| c5d31c7d56 | |||
|
|
562f1fb846 | ||
|
|
5f9e2b3f14 | ||
|
|
41552f695c | ||
|
|
a602f83d44 | ||
| 510df4ea4c | |||
|
|
ab7150a97f | ||
| 0673000ad4 | |||
|
|
88975f3cc8 | ||
|
|
9fb176751c | ||
|
|
eabf65a55f | ||
| b5c8b6aad3 | |||
| 909460018b | |||
| 7392481903 | |||
| a0ed6d163d | |||
| 6e64f86521 | |||
| 2c8a9a9caf | |||
| 9f1a480357 | |||
|
|
478eaf89a1 | ||
|
|
9eb6e26435 | ||
|
|
3c5b372f7d | ||
|
|
f7eec3720e | ||
| 967be7019d | |||
| 907240e003 | |||
|
|
bb1ad785a5 | ||
| 7b2f9e34a3 | |||
|
|
de2e998730 | ||
|
|
7b2dc53eae | ||
|
|
614abd01ac | ||
|
|
5932d67fce | ||
|
|
02bf6c5baa | ||
|
|
3f2b0b2a7e | ||
| 5b50209ba5 | |||
| 5ff333808a | |||
|
|
dfe1e98d80 | ||
| 9da106fedc | |||
| 7fb839efed | |||
|
|
0bf78e1f67 | ||
|
|
3f6708e53c | ||
| 9bef2c6641 | |||
|
|
bc52b9c528 | ||
|
|
ba9a155280 | ||
|
|
5dc95d3339 | ||
|
|
b7b668321f | ||
|
|
a4139c1e19 | ||
|
|
bccc89f794 | ||
|
|
1e91212d19 | ||
|
|
10b672918b | ||
|
|
4af0a3c80f | ||
|
|
95b57b78f6 | ||
|
|
c49e1336d0 | ||
|
|
cc4f56e30c | ||
|
|
69b8f4f90b | ||
|
|
69bd4f599a | ||
|
|
055f8a67ae | ||
|
|
4ed2afda72 | ||
|
|
96f99306dc | ||
|
|
2a36bce0a1 | ||
|
|
640b1b800a | ||
|
|
5f662b22f4 | ||
|
|
d6d2799485 | ||
|
|
3140801317 | ||
|
|
7afaa53d1f | ||
|
|
4aa8475929 | ||
|
|
f494f160c7 | ||
|
|
4d54b001c1 | ||
|
|
0cca391d3d | ||
|
|
fd1a57b0ee | ||
|
|
c599f7e713 | ||
| d799fdd658 | |||
| a52c4a1bbd | |||
| bc8e618bda | |||
| 5a9e04c1d0 | |||
| 434ebf6cea | |||
| 229efeacc1 | |||
| 006784fe06 | |||
| 6229dc09d8 | |||
| 81a9fac7c8 | |||
| 0ba9b8f6e7 | |||
| 736ad4fcfa | |||
|
|
65f1c6975a | ||
|
|
2d45e03095 | ||
|
|
b645682de8 | ||
| a3068e9223 | |||
| c84d94efd9 | |||
|
|
8f04e926f6 | ||
|
|
e28d5ff9a4 | ||
| 5b892d6d7d | |||
| d486cd735a | |||
|
|
81e1d13cff | ||
|
|
e83cd4b167 | ||
|
|
cdb095c848 | ||
|
|
6be675de20 | ||
|
|
9b3858abbe | ||
|
|
d1f5093ad9 | ||
|
|
2c008a202f | ||
|
|
ccb552cc1e | ||
|
|
6692eef319 | ||
| 6f59dfc85c | |||
|
|
13f3065a01 | ||
|
|
d797b0d2c0 | ||
|
|
08746d3262 | ||
|
|
994da39fd7 | ||
|
|
d1b200d9ca | ||
|
|
1b25b0b4f3 | ||
|
|
e0f78f851f | ||
|
|
bab76df6db | ||
|
|
e779ec308e | ||
|
|
405dc82ac6 | ||
|
|
ab0b402884 | ||
|
|
c603a99c0d | ||
|
|
20e249c48d | ||
|
|
d34753b981 | ||
|
|
280ed97a50 | ||
|
|
d31419797a | ||
|
|
02105ac727 | ||
|
|
8e7b0623e5 | ||
|
|
e1eb6c3f67 | ||
|
|
6c8dcc609b | ||
|
|
4f126f4ac2 | ||
|
|
a692d626c2 | ||
|
|
84dcfbb8b7 | ||
|
|
ecb772b8a8 | ||
|
|
701c36f603 | ||
|
|
0631eb71e0 | ||
|
|
9502329fef | ||
|
|
8287ce3963 | ||
|
|
8ac566c9b2 | ||
| 33079825a6 | |||
|
|
40ac84d168 | ||
|
|
8ee8c3e61b | ||
|
|
19231f293b | ||
|
|
ffaf049772 | ||
| 2e086c9fea | |||
| e0d9c5c983 | |||
| f54d7c4438 | |||
| 31028d0bd4 | |||
| 11bcd877d5 | |||
| 99d40b1cf0 | |||
| 42539fb402 | |||
| e980446dfe | |||
|
|
b52ffa5106 | ||
|
|
a2c7df7af3 | ||
|
|
17a67feca2 | ||
|
|
b7a60abd3e | ||
|
|
107b1ca590 | ||
| fbf6032e5a | |||
|
|
b1c667cefc | ||
|
|
f8415939ea | ||
| 318e9b3a07 | |||
| 2e2fc28dbc | |||
| 96cb77e417 | |||
| 3b549b48e3 | |||
|
|
fc93b98ec3 | ||
| 65acfba4fe | |||
| 8956919459 | |||
| ca2033a3a6 | |||
| f7e2407ecd | |||
| 5d6773d879 | |||
|
|
d3d5208a90 | ||
|
|
fb026079ef | ||
|
|
ac684ca260 | ||
|
|
da80715bca | ||
|
|
e6e2a12729 | ||
|
|
c08b93aa81 | ||
|
|
3b616f21ba | ||
|
|
d4662d413f | ||
|
|
41687dfdd6 | ||
|
|
43caa255a1 | ||
|
|
79ded6f451 | ||
|
|
050b49af2d | ||
|
|
2afa04a82e | ||
|
|
f6e0081d94 | ||
|
|
9c0fb13837 | ||
|
|
d2c2436212 | ||
|
|
666419507f | ||
|
|
5fdbe4fc25 | ||
|
|
c41e7da05f | ||
|
|
254274b40f | ||
|
|
08ebcb740c | ||
|
|
793d80270b | ||
|
|
cc88d9af3f | ||
|
|
e696604be6 | ||
|
|
f2ed8321e1 | ||
|
|
d4dc39b47e | ||
|
|
f62c1a9389 | ||
| 15d70c8df2 | |||
|
|
b41b130bf1 | ||
| 264642795d | |||
| 7dcc538eee | |||
|
|
7482ed67c6 | ||
|
|
102f0e07ae | ||
|
|
deaf9e8e1b | ||
|
|
212d6b3ae9 | ||
|
|
c7411ec240 | ||
|
|
b81357ed87 | ||
|
|
5aaecb5c4f | ||
| ec8ae3b960 | |||
| 6c7fe4669b | |||
| 91e921ca6d | |||
| 6ae35315b3 | |||
| 17ca3b2e50 | |||
|
|
973bfbbc75 | ||
|
|
085d3a876e | ||
|
|
d66107ec1e | ||
|
|
a999dfbdd6 | ||
|
|
c49bc3ddb3 | ||
|
|
d48bef9e67 | ||
|
|
631d589386 | ||
|
|
7e70608ba4 | ||
|
|
d03eed23c3 | ||
|
|
d51fd932e7 | ||
|
|
9af9c343d1 | ||
|
|
a79dd22311 | ||
|
|
77cc5a4b24 | ||
| 5afd104d15 | |||
| 7db25c2226 | |||
|
|
38a8fb2d7d | ||
| 5b548e5071 | |||
|
|
28d987927f | ||
|
|
b8fb8bd09a | ||
|
|
15b3e6d3cb | ||
|
|
1aed2a20ba | ||
| 60a0d5468b | |||
| 318ccb6f79 | |||
| 6f5c886f74 | |||
|
|
7d0d759096 | ||
|
|
506a3fefd1 | ||
| 5e0e96063b | |||
| 8a97d2d109 | |||
| 2296fd0e19 | |||
| 7f57155de7 | |||
|
|
e239381dfe | ||
|
|
e11b01f0aa | ||
| e11743f3fe | |||
| 65b92d8e4d | |||
|
|
1cd97f2ddd | ||
| 44a783b38b | |||
|
|
c0070b1381 | ||
|
|
3f8475f418 | ||
|
|
d3d918b838 | ||
|
|
4eba7f893a | ||
|
|
02c04a4346 | ||
|
|
187282fe9f | ||
|
|
0601936ca5 | ||
|
|
5785bf6324 | ||
|
|
7ac9ca5922 | ||
|
|
ba2bb1220a | ||
|
|
abf17c9b8a | ||
|
|
c0de927d15 | ||
|
|
9641ee6bb9 | ||
|
|
dc1356f234 | ||
|
|
4ed858b7e7 | ||
|
|
32ab6fdcf0 | ||
|
|
947cccfeac | ||
| 2900d3158d | |||
| c1f66b23c3 | |||
|
|
1ae4d4acab | ||
|
|
1614387654 | ||
|
|
287798c266 | ||
|
|
de00c6dfa2 | ||
|
|
a0bf63a2ab | ||
|
|
93bdec5616 | ||
|
|
88f1b40683 | ||
|
|
92f8da6c5f | ||
|
|
ad03847bff | ||
|
|
f4239a2d40 | ||
|
|
2ef55f8df5 | ||
|
|
acf121cc2c | ||
| ce1df671f7 | |||
| 6287165266 | |||
| c4f869efd3 | |||
|
|
0ee821bf46 | ||
|
|
00031b366d | ||
|
|
8122b49be6 | ||
|
|
265e878955 | ||
|
|
20842fa3e0 | ||
|
|
1b9d1bf0b3 | ||
|
|
5e6a144b67 | ||
|
|
1e137ae1dc | ||
|
|
2acad72e0e | ||
|
|
9b0371dc7a | ||
|
|
8e9e5e4843 | ||
|
|
edf293b203 | ||
| e2061a3f5d | |||
|
|
d0390d3f9f | ||
|
|
a809828b80 | ||
| 486f0d758b | |||
|
|
1f033a6f25 | ||
| 5b5e45baf6 | |||
|
|
a02359a797 | ||
|
|
edd005e132 | ||
|
|
ac80537ab5 | ||
|
|
f3297988ff | ||
|
|
a4d49c7078 | ||
|
|
df68c70127 | ||
|
|
70344ff310 | ||
|
|
5adb00f04c | ||
|
|
86a49ea4d0 | ||
|
|
991fda7ccb | ||
|
|
aa41da8a68 | ||
|
|
a3de0bf8de | ||
| a3e9ba5633 | |||
| a326f4c4e5 | |||
| 669c2483f8 | |||
|
|
d277d7ced1 | ||
|
|
4de7e6b741 | ||
|
|
b3572210ea | ||
|
|
de4d33e3db | ||
|
|
9b1d869c84 | ||
|
|
7e425d10e6 | ||
|
|
3f21b90c6d | ||
|
|
7baf5e4520 |
42
Jenkinsfile
vendored
Normal file
42
Jenkinsfile
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
pipeline {
|
||||
agent any
|
||||
|
||||
environment {
|
||||
PHP_VERSION = '8.1'
|
||||
COMPOSER_HOME = "${WORKSPACE}/.composer"
|
||||
DASHBOARD = '/var/www/lpj'
|
||||
WORKDIR = '/var/www/lpj/Modules/Lpj'
|
||||
GIT_SSH_COMMAND = 'ssh -i ~/.ssh/for_gitea -o StrictHostKeyChecking=no'
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Checkout') {
|
||||
steps {
|
||||
dir("${env.DASHBOARD}") {
|
||||
sh "composer update daengdeni/lpj-module:dev-staging"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Build Assets') {
|
||||
steps {
|
||||
dir("${env.DASHBOARD}") {
|
||||
sh "npm install"
|
||||
sh "npm run build"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
post {
|
||||
always {
|
||||
cleanWs()
|
||||
}
|
||||
success {
|
||||
echo 'The pipeline has succeeded!'
|
||||
}
|
||||
failure {
|
||||
echo 'The pipeline has failed.'
|
||||
}
|
||||
}
|
||||
}
|
||||
228
app/Console/Commands/CleanupInspeksiDataCommand.php
Normal file
228
app/Console/Commands/CleanupInspeksiDataCommand.php
Normal file
@@ -0,0 +1,228 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Modules\Lpj\Jobs\CleanupInspeksiDataJob;
|
||||
use Modules\Lpj\Models\Inspeksi;
|
||||
use Modules\Lpj\Services\InspeksiCleanupService;
|
||||
|
||||
class CleanupInspeksiDataCommand extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'lpj:cleanup-inspeksi
|
||||
{--permohonan-id= : ID permohonan yang akan di-cleanup (opsional)}
|
||||
{--sync : Jalankan secara synchronous}
|
||||
{--dry-run : Tampilkan preview tanpa menjalankan cleanup}
|
||||
{--force : Jalankan tanpa konfirmasi}';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Cleanup data inspeksi lama yang tidak memiliki dokument_id';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle(): int
|
||||
{
|
||||
Log::info('CleanupInspeksiDataCommand: Memulai proses cleanup data inspeksi', [
|
||||
'options' => $this->options()
|
||||
]);
|
||||
|
||||
try {
|
||||
$permohonanId = $this->option('permohonan-id');
|
||||
$sync = $this->option('sync');
|
||||
$dryRun = $this->option('dry-run');
|
||||
$force = $this->option('force');
|
||||
|
||||
// Validasi opsi
|
||||
if ($dryRun && $sync) {
|
||||
$this->error('Opsi --dry-run dan --sync tidak dapat digunakan bersamaan.');
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
// Tampilkan header
|
||||
$this->info('=== Cleanup Data Inspeksi ===');
|
||||
$this->newLine();
|
||||
|
||||
// Ambil data yang akan di-cleanup
|
||||
$cleanupData = $this->getCleanupData($permohonanId);
|
||||
|
||||
if ($cleanupData->isEmpty()) {
|
||||
$this->info('Tidak ada data yang perlu di-cleanup.');
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
|
||||
// Tampilkan preview data
|
||||
$this->displayPreview($cleanupData);
|
||||
|
||||
if ($dryRun) {
|
||||
$this->info('Mode dry-run: Tidak ada perubahan yang dilakukan.');
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
|
||||
// Konfirmasi jika tidak force
|
||||
if (!$force && !$this->confirm('Lanjutkan dengan cleanup?')) {
|
||||
$this->info('Cleanup dibatalkan.');
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
|
||||
// Jalankan cleanup
|
||||
$this->runCleanup($cleanupData, $sync);
|
||||
|
||||
$this->info('Proses cleanup selesai.');
|
||||
return Command::SUCCESS;
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error('CleanupInspeksiDataCommand: Terjadi error saat proses cleanup', [
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString()
|
||||
]);
|
||||
|
||||
$this->error('Terjadi kesalahan: ' . $e->getMessage());
|
||||
return Command::FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ambil data yang akan di-cleanup
|
||||
*/
|
||||
private function getCleanupData(?int $permohonanId = null)
|
||||
{
|
||||
$this->info('Mencari data yang akan di-cleanup...');
|
||||
|
||||
$query = DB::table('inspeksi as i')
|
||||
->select(
|
||||
'i.permohonan_id',
|
||||
'i.created_by',
|
||||
DB::raw('COUNT(CASE WHEN i.dokument_id IS NOT NULL AND i.deleted_at IS NULL THEN 1 END) as new_data_count'),
|
||||
DB::raw('COUNT(CASE WHEN i.dokument_id IS NULL AND i.deleted_at IS NULL THEN 1 END) as old_data_count')
|
||||
)
|
||||
->whereNull('i.deleted_at')
|
||||
->groupBy('i.permohonan_id', 'i.created_by');
|
||||
|
||||
if ($permohonanId) {
|
||||
$query->where('i.permohonan_id', $permohonanId);
|
||||
}
|
||||
|
||||
$results = $query->havingRaw('new_data_count > 0 AND old_data_count > 0')
|
||||
->get();
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tampilkan preview data
|
||||
*/
|
||||
private function displayPreview($cleanupData): void
|
||||
{
|
||||
$this->info('Data yang akan di-cleanup:');
|
||||
$this->table(
|
||||
['Permohonan ID', 'Created By', 'Data Baru', 'Data Lama'],
|
||||
$cleanupData->map(function ($item) {
|
||||
return [
|
||||
$item->permohonan_id,
|
||||
$item->created_by,
|
||||
$item->new_data_count,
|
||||
$item->old_data_count
|
||||
];
|
||||
})->toArray()
|
||||
);
|
||||
|
||||
$totalPermohonan = $cleanupData->count();
|
||||
$totalOldData = $cleanupData->sum('old_data_count');
|
||||
|
||||
$this->info("Total permohonan: {$totalPermohonan}");
|
||||
$this->info("Total data lama yang akan dihapus: {$totalOldData}");
|
||||
$this->newLine();
|
||||
}
|
||||
|
||||
/**
|
||||
* Jalankan cleanup
|
||||
*/
|
||||
private function runCleanup($cleanupData, bool $sync): void
|
||||
{
|
||||
$this->info('Memulai proses cleanup...');
|
||||
$this->newLine();
|
||||
|
||||
$progressBar = $this->output->createProgressBar($cleanupData->count());
|
||||
$progressBar->setFormat('Processing: %current%/%max% [%bar%] %percent:3s%% %message%');
|
||||
$progressBar->start();
|
||||
|
||||
$totalDeleted = 0;
|
||||
$totalErrors = 0;
|
||||
|
||||
foreach ($cleanupData as $data) {
|
||||
try {
|
||||
$progressBar->setMessage("Permohonan ID: {$data->permohonan_id}");
|
||||
|
||||
// Ambil data baru untuk mendapatkan dokument_id
|
||||
$newInspeksi = Inspeksi::where('permohonan_id', $data->permohonan_id)
|
||||
->where('created_by', $data->created_by)
|
||||
->whereNotNull('dokument_id')
|
||||
->whereNull('deleted_at')
|
||||
->first();
|
||||
|
||||
if (!$newInspeksi) {
|
||||
$this->warn("Tidak ditemukan data baru untuk permohonan {$data->permohonan_id}");
|
||||
$progressBar->advance();
|
||||
continue;
|
||||
}
|
||||
|
||||
// Jalankan cleanup
|
||||
if ($sync) {
|
||||
// Jalankan sync
|
||||
$job = new CleanupInspeksiDataJob(
|
||||
$data->permohonan_id,
|
||||
$data->created_by,
|
||||
$newInspeksi->dokument_id
|
||||
);
|
||||
$job->handle();
|
||||
} else {
|
||||
// Dispatch ke queue
|
||||
CleanupInspeksiDataJob::dispatch(
|
||||
$data->permohonan_id,
|
||||
$data->created_by,
|
||||
$newInspeksi->dokument_id
|
||||
);
|
||||
}
|
||||
|
||||
$totalDeleted += $data->old_data_count;
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error('CleanupInspeksiDataCommand: Error pada permohonan', [
|
||||
'permohonan_id' => $data->permohonan_id,
|
||||
'created_by' => $data->created_by,
|
||||
'error' => $e->getMessage()
|
||||
]);
|
||||
|
||||
$this->error("Error pada permohonan {$data->permohonan_id}: {$e->getMessage()}");
|
||||
$totalErrors++;
|
||||
}
|
||||
|
||||
$progressBar->advance();
|
||||
}
|
||||
|
||||
$progressBar->finish();
|
||||
$this->newLine();
|
||||
$this->newLine();
|
||||
|
||||
// Tampilkan hasil
|
||||
$this->info('=== Hasil Cleanup ===');
|
||||
$this->info("Data lama yang dihapus: {$totalDeleted}");
|
||||
$this->info("Error: {$totalErrors}");
|
||||
|
||||
if (!$sync) {
|
||||
$this->info('Job telah di-dispatch ke queue. Monitor progress di log.');
|
||||
}
|
||||
}
|
||||
}
|
||||
192
app/Console/Commands/CleanupInspeksiStatusCommand.php
Normal file
192
app/Console/Commands/CleanupInspeksiStatusCommand.php
Normal file
@@ -0,0 +1,192 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Modules\Lpj\Models\Inspeksi;
|
||||
|
||||
class CleanupInspeksiStatusCommand extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'lpj:cleanup-inspeksi-status
|
||||
{--permohonan-id= : Filter berdasarkan permohonan ID}
|
||||
{--created-by= : Filter berdasarkan user ID}
|
||||
{--detailed : Tampilkan detail data}';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Cek status data inspeksi yang memerlukan cleanup';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle(): int
|
||||
{
|
||||
try {
|
||||
$permohonanId = $this->option('permohonan-id');
|
||||
$createdBy = $this->option('created-by');
|
||||
$detailed = $this->option('detailed');
|
||||
|
||||
$this->info('=== Status Data Inspeksi ===');
|
||||
$this->newLine();
|
||||
|
||||
// Ambil statistik umum
|
||||
$this->showGeneralStats();
|
||||
|
||||
// Ambil data yang memerlukan cleanup
|
||||
$this->showCleanupStats($permohonanId, $createdBy);
|
||||
|
||||
if ($detailed) {
|
||||
$this->showDetailedData($permohonanId, $createdBy);
|
||||
}
|
||||
|
||||
return Command::SUCCESS;
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error('CleanupInspeksiStatusCommand: Terjadi error', [
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString()
|
||||
]);
|
||||
|
||||
$this->error('Terjadi kesalahan: ' . $e->getMessage());
|
||||
return Command::FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tampilkan statistik umum
|
||||
*/
|
||||
private function showGeneralStats(): void
|
||||
{
|
||||
$this->info('Statistik Umum:');
|
||||
|
||||
$totalData = Inspeksi::count();
|
||||
$activeData = Inspeksi::whereNull('deleted_at')->count();
|
||||
$deletedData = Inspeksi::whereNotNull('deleted_at')->count();
|
||||
$dataWithDokument = Inspeksi::whereNotNull('dokument_id')->count();
|
||||
$dataWithoutDokument = Inspeksi::whereNull('dokument_id')->count();
|
||||
|
||||
$this->table(
|
||||
['Metrik', 'Jumlah'],
|
||||
[
|
||||
['Total Data', number_format($totalData)],
|
||||
['Data Aktif', number_format($activeData)],
|
||||
['Data Terhapus (Soft)', number_format($deletedData)],
|
||||
['Data dengan Dokument ID', number_format($dataWithDokument)],
|
||||
['Data tanpa Dokument ID', number_format($dataWithoutDokument)],
|
||||
]
|
||||
);
|
||||
|
||||
$this->newLine();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tampilkan statistik cleanup
|
||||
*/
|
||||
private function showCleanupStats(?int $permohonanId = null, ?int $createdBy = null): void
|
||||
{
|
||||
$this->info('Data yang Memerlukan Cleanup:');
|
||||
|
||||
$query = DB::table('inspeksi as i')
|
||||
->select(
|
||||
'i.permohonan_id',
|
||||
'i.created_by',
|
||||
DB::raw('COUNT(CASE WHEN i.dokument_id IS NOT NULL AND i.deleted_at IS NULL THEN 1 END) as new_data_count'),
|
||||
DB::raw('COUNT(CASE WHEN i.dokument_id IS NULL AND i.deleted_at IS NULL THEN 1 END) as old_data_count'),
|
||||
DB::raw('MIN(i.created_at) as oldest_data'),
|
||||
DB::raw('MAX(i.created_at) as newest_data')
|
||||
)
|
||||
->whereNull('i.deleted_at')
|
||||
->groupBy('i.permohonan_id', 'i.created_by');
|
||||
|
||||
if ($permohonanId) {
|
||||
$query->where('i.permohonan_id', $permohonanId);
|
||||
}
|
||||
|
||||
if ($createdBy) {
|
||||
$query->where('i.created_by', $createdBy);
|
||||
}
|
||||
|
||||
$results = $query->havingRaw('new_data_count > 0 AND old_data_count > 0')
|
||||
->orderBy('old_data_count', 'desc')
|
||||
->limit(20)
|
||||
->get();
|
||||
|
||||
if ($results->isEmpty()) {
|
||||
$this->info('Tidak ada data yang memerlukan cleanup.');
|
||||
return;
|
||||
}
|
||||
|
||||
$this->table(
|
||||
['Permohonan ID', 'Created By', 'Data Baru', 'Data Lama', 'Data Terlama', 'Data Terbaru'],
|
||||
$results->map(function ($item) {
|
||||
return [
|
||||
$item->permohonan_id,
|
||||
$item->created_by,
|
||||
$item->new_data_count,
|
||||
$item->old_data_count,
|
||||
$item->oldest_data,
|
||||
$item->newest_data,
|
||||
];
|
||||
})->toArray()
|
||||
);
|
||||
|
||||
$totalPermohonan = $results->count();
|
||||
$totalOldData = $results->sum('old_data_count');
|
||||
|
||||
$this->info("Total permohonan yang perlu cleanup: {$totalPermohonan}");
|
||||
$this->info("Total data lama yang akan dihapus: {$totalOldData}");
|
||||
$this->newLine();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tampilkan detail data
|
||||
*/
|
||||
private function showDetailedData(?int $permohonanId = null, ?int $createdBy = null): void
|
||||
{
|
||||
$this->info('Detail Data (20 data terbaru):');
|
||||
|
||||
$query = Inspeksi::with(['permohonan', 'dokument'])
|
||||
->whereNull('deleted_at');
|
||||
|
||||
if ($permohonanId) {
|
||||
$query->where('permohonan_id', $permohonanId);
|
||||
}
|
||||
|
||||
if ($createdBy) {
|
||||
$query->where('created_by', $createdBy);
|
||||
}
|
||||
|
||||
$data = $query->orderBy('created_at', 'desc')
|
||||
->limit(20)
|
||||
->get();
|
||||
|
||||
if ($data->isEmpty()) {
|
||||
$this->info('Tidak ada data untuk ditampilkan.');
|
||||
return;
|
||||
}
|
||||
|
||||
$this->table(
|
||||
['ID', 'Permohonan ID', 'Created By', 'Dokument ID', 'Status', 'Created At'],
|
||||
$data->map(function ($item) {
|
||||
return [
|
||||
$item->id,
|
||||
$item->permohonan_id,
|
||||
$item->created_by,
|
||||
$item->dokument_id ?? '-',
|
||||
$item->status,
|
||||
$item->created_at,
|
||||
];
|
||||
})->toArray()
|
||||
);
|
||||
}
|
||||
}
|
||||
99
app/Console/Commands/CleanupSingleInspeksiCommand.php
Normal file
99
app/Console/Commands/CleanupSingleInspeksiCommand.php
Normal file
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Modules\Lpj\Jobs\CleanupInspeksiDataJob;
|
||||
use Modules\Lpj\Services\InspeksiCleanupService;
|
||||
|
||||
class CleanupSingleInspeksiCommand extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'lpj:cleanup-single-inspeksi
|
||||
{permohonan-id : ID permohonan yang akan di-cleanup}
|
||||
{created-by : ID user yang membuat data}
|
||||
{--sync : Jalankan secara synchronous}
|
||||
{--force : Jalankan tanpa konfirmasi}';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Cleanup data inspeksi untuk 1 permohonan dan user tertentu';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle(): int
|
||||
{
|
||||
Log::info('CleanupSingleInspeksiCommand: Memulai proses cleanup', [
|
||||
'permohonan_id' => $this->argument('permohonan-id'),
|
||||
'created_by' => $this->argument('created-by'),
|
||||
'sync' => $this->option('sync')
|
||||
]);
|
||||
|
||||
try {
|
||||
$permohonanId = (int) $this->argument('permohonan-id');
|
||||
$createdBy = (int) $this->argument('created-by');
|
||||
$sync = $this->option('sync');
|
||||
$force = $this->option('force');
|
||||
|
||||
// Validasi input
|
||||
if ($permohonanId <= 0) {
|
||||
$this->error('Permohonan ID harus angka positif.');
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
if ($createdBy <= 0) {
|
||||
$this->error('Created By harus angka positif.');
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
// Tampilkan info
|
||||
$this->info('=== Cleanup Single Inspeksi ===');
|
||||
$this->info("Permohonan ID: {$permohonanId}");
|
||||
$this->info("Created By: {$createdBy}");
|
||||
$this->info("Mode: " . ($sync ? 'Synchronous' : 'Queue'));
|
||||
$this->newLine();
|
||||
|
||||
// Konfirmasi jika tidak force
|
||||
if (!$force && !$this->confirm('Lanjutkan dengan cleanup?')) {
|
||||
$this->info('Cleanup dibatalkan.');
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
|
||||
// Jalankan cleanup
|
||||
$cleanupService = new InspeksiCleanupService();
|
||||
|
||||
if ($sync) {
|
||||
$this->info('Menjalankan cleanup secara synchronous...');
|
||||
$cleanupService->cleanupSync($permohonanId, $createdBy);
|
||||
$this->info('Cleanup selesai.');
|
||||
} else {
|
||||
$this->info('Mengirim job ke queue...');
|
||||
$cleanupService->cleanupAsync($permohonanId, $createdBy);
|
||||
$this->info('Job telah di-dispatch ke queue.');
|
||||
$this->info('Monitor progress di log.');
|
||||
}
|
||||
|
||||
return Command::SUCCESS;
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error('CleanupSingleInspeksiCommand: Terjadi error saat proses cleanup', [
|
||||
'permohonan_id' => $this->argument('permohonan-id'),
|
||||
'created_by' => $this->argument('created-by'),
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString()
|
||||
]);
|
||||
|
||||
$this->error('Terjadi kesalahan: ' . $e->getMessage());
|
||||
return Command::FAILURE;
|
||||
}
|
||||
}
|
||||
}
|
||||
123
app/Console/README.md
Normal file
123
app/Console/README.md
Normal file
@@ -0,0 +1,123 @@
|
||||
# Console Commands untuk Cleanup Data Inspeksi
|
||||
|
||||
## Daftar Command
|
||||
|
||||
### 1. `lpj:cleanup-inspeksi`
|
||||
Command utama untuk cleanup data inspeksi secara batch.
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
php artisan lpj:cleanup-inspeksi [options]
|
||||
```
|
||||
|
||||
**Options:**
|
||||
- `--permohonan-id=ID` - Filter berdasarkan permohonan ID (opsional)
|
||||
- `--sync` - Jalankan secara synchronous
|
||||
- `--dry-run` - Tampilkan preview tanpa menjalankan cleanup
|
||||
- `--force` - Jalankan tanpa konfirmasi
|
||||
|
||||
**Contoh Penggunaan:**
|
||||
```bash
|
||||
# Preview data yang akan di-cleanup
|
||||
php artisan lpj:cleanup-inspeksi --dry-run
|
||||
|
||||
# Cleanup semua data (dengan konfirmasi)
|
||||
php artisan lpj:cleanup-inspeksi
|
||||
|
||||
# Cleanup untuk permohonan tertentu
|
||||
php artisan lpj:cleanup-inspeksi --permohonan-id=123 --force
|
||||
|
||||
# Jalankan secara sync
|
||||
php artisan lpj:cleanup-inspeksi --sync --force
|
||||
```
|
||||
|
||||
### 2. `lpj:cleanup-single-inspeksi`
|
||||
Command untuk cleanup 1 permohonan dan user tertentu.
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
php artisan lpj:cleanup-single-inspeksi <permohonan-id> <created-by> [options]
|
||||
```
|
||||
|
||||
**Arguments:**
|
||||
- `permohonan-id` - ID permohonan yang akan di-cleanup (required)
|
||||
- `created-by` - ID user yang membuat data (required)
|
||||
|
||||
**Options:**
|
||||
- `--sync` - Jalankan secara synchronous
|
||||
- `--force` - Jalankan tanpa konfirmasi
|
||||
|
||||
**Contoh Penggunaan:**
|
||||
```bash
|
||||
# Cleanup untuk permohonan 123 oleh user 456
|
||||
php artisan lpj:cleanup-single-inspeksi 123 456
|
||||
|
||||
# Jalankan secara sync tanpa konfirmasi
|
||||
php artisan lpj:cleanup-single-inspeksi 123 456 --sync --force
|
||||
```
|
||||
|
||||
### 3. `lpj:cleanup-inspeksi-status`
|
||||
Command untuk mengecek status data inspeksi dan melihat statistik cleanup.
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
php artisan lpj:cleanup-inspeksi-status [options]
|
||||
```
|
||||
|
||||
**Options:**
|
||||
- `--permohonan-id=ID` - Filter berdasarkan permohonan ID
|
||||
- `--created-by=ID` - Filter berdasarkan user ID
|
||||
- `--detailed` - Tampilkan detail data
|
||||
|
||||
**Contoh Penggunaan:**
|
||||
```bash
|
||||
# Lihat statistik umum
|
||||
php artisan lpj:cleanup-inspeksi-status
|
||||
|
||||
# Filter berdasarkan permohonan
|
||||
php artisan lpj:cleanup-inspeksi-status --permohonan-id=123
|
||||
|
||||
# Tampilkan detail data
|
||||
php artisan lpj:cleanup-inspeksi-status --detailed
|
||||
```
|
||||
|
||||
## Scheduling
|
||||
|
||||
Command cleanup otomatis dijalankan setiap hari jam 2 pagi dan setiap minggu. Konfigurasi scheduling ada di `LpjServiceProvider.php`.
|
||||
|
||||
## Monitoring
|
||||
|
||||
Semua aktivitas cleanup dicatat di log file:
|
||||
- `storage/logs/laravel.log` - Log umum
|
||||
- `storage/logs/cleanup-inspeksi.log` - Log cleanup harian
|
||||
- `storage/logs/cleanup-inspeksi-weekly.log` - Log cleanup mingguan
|
||||
|
||||
## Alur Kerja Cleanup
|
||||
|
||||
1. **Identifikasi**: Cari data inspeksi yang memiliki:
|
||||
- Data baru dengan `dokument_id` (tidak null)
|
||||
- Data lama tanpa `dokument_id` (null)
|
||||
- Sama `permohonan_id` dan `created_by`
|
||||
|
||||
2. **Proses**: Soft delete data lama menggunakan Laravel SoftDeletes
|
||||
|
||||
3. **Logging**: Catat setiap operasi untuk audit trail
|
||||
|
||||
4. **Transaction**: Gunakan DB transaction untuk konsistensi data
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Command tidak muncul
|
||||
Pastikan service provider sudah diregister dengan benar:
|
||||
```bash
|
||||
php artisan list | grep lpj
|
||||
```
|
||||
|
||||
### Data tidak ter-cleanup
|
||||
- Cek log untuk error
|
||||
- Pastikan ada data yang memenuhi kriteria
|
||||
- Gunakan `--dry-run` untuk preview
|
||||
- Gunakan `--detailed` untuk melihat detail data
|
||||
|
||||
### Performance
|
||||
Untuk data besar, gunakan mode queue (default) daripada `--sync`
|
||||
63
app/Emails/SendJadwalKunjunganEmail.php
Normal file
63
app/Emails/SendJadwalKunjunganEmail.php
Normal file
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Emails;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Mail\Mailable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
|
||||
class SendJadwalKunjunganEmail extends Mailable
|
||||
{
|
||||
/**
|
||||
* ID Penilaian.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $id;
|
||||
|
||||
/**
|
||||
* Waktu Penilaian.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $waktu_penilaian;
|
||||
|
||||
/**
|
||||
* Deskripsi Penilaian.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $deskripsi_penilaian;
|
||||
|
||||
/**
|
||||
* Create a new message instance.
|
||||
*
|
||||
* @param array $emailData
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(array $emailData)
|
||||
{
|
||||
// Validasi data yang diterima
|
||||
if (!isset($emailData['emailData']['id']) ||
|
||||
!isset($emailData['emailData']['waktu_penilaian']) ||
|
||||
!isset($emailData['emailData']['deskripsi_penilaian'])) {
|
||||
throw new \InvalidArgumentException("Data email tidak lengkap.");
|
||||
}
|
||||
|
||||
$this->id = $emailData['emailData']['id'];
|
||||
$this->waktu_penilaian = $emailData['emailData']['waktu_penilaian'];
|
||||
$this->deskripsi_penilaian = $emailData['emailData']['deskripsi_penilaian'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the message.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function build()
|
||||
{
|
||||
return $this->subject('Jadwal Kunjungan Penilaian Resmi')
|
||||
->view('lpj::emails.jadwal-kunjungan');
|
||||
}
|
||||
}
|
||||
58
app/Emails/SendPenawaranKJPPEmail.php
Normal file
58
app/Emails/SendPenawaranKJPPEmail.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Emails;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Mail\Mailable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
// use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
|
||||
class SendPenawaranKJPPEmail extends Mailable
|
||||
{
|
||||
use Queueable, SerializesModels;
|
||||
|
||||
// Tambahkan properti untuk data yang akan dikirimkan ke view
|
||||
public $dp1;
|
||||
public $penawaran;
|
||||
public $permohonan;
|
||||
public $villages;
|
||||
public $districts;
|
||||
public $cities;
|
||||
public $provinces;
|
||||
public $user; // Tambahkan user ke data yang dikirimkan ke view, sebagai cc dan bcc
|
||||
|
||||
/**
|
||||
* Create a new message instance.
|
||||
*/
|
||||
public function __construct($dp1, $penawaran, $permohonan, $villages, $districts, $cities, $provinces, $user)
|
||||
{
|
||||
// Assign data yang diterima ke properti
|
||||
$this->dp1 = $dp1;
|
||||
$this->penawaran = $penawaran;
|
||||
$this->permohonan = $permohonan;
|
||||
$this->villages = $villages;
|
||||
$this->districts = $districts;
|
||||
$this->cities = $cities;
|
||||
$this->provinces = $provinces;
|
||||
$this->user = $user; // Tambahkan user ke data yang dikirimkan ke view, sebagai cc dan bcc
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the message.
|
||||
*/
|
||||
public function build(): self
|
||||
{
|
||||
// Kirim data ke view
|
||||
return $this->view('lpj::penawaran.kirimEmailKJPP')
|
||||
->with([
|
||||
'dp1' => $this->dp1,
|
||||
'penawaran' => $this->penawaran,
|
||||
'permohonan' => $this->permohonan,
|
||||
'villages' => $this->villages,
|
||||
'districts' => $this->districts,
|
||||
'cities' => $this->cities,
|
||||
'provinces' => $this->provinces,
|
||||
'user' => $this->user // Tambahkan user ke data yang dikirimkan ke view, sebagai cc dan bcc
|
||||
]);
|
||||
}
|
||||
}
|
||||
29
app/Emails/SendPenawaranTenderEmail.php
Normal file
29
app/Emails/SendPenawaranTenderEmail.php
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Emails;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Mail\Mailable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
// use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
|
||||
class SendPenawaranTenderEmail extends Mailable
|
||||
{
|
||||
use Queueable, SerializesModels;
|
||||
|
||||
/**
|
||||
* Create a new message instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the message.
|
||||
*/
|
||||
public function build(): self
|
||||
{
|
||||
return $this->view('lpj::penawaran.kirimEmail');
|
||||
}
|
||||
}
|
||||
58
app/Exports/BasicDataSurveyorExport.php
Normal file
58
app/Exports/BasicDataSurveyorExport.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Exports;
|
||||
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
|
||||
|
||||
class BasicDataSurveyorExport implements WithColumnFormatting, WithHeadings, FromCollection, withMapping
|
||||
{
|
||||
|
||||
|
||||
protected $model;
|
||||
|
||||
|
||||
public function __construct($model)
|
||||
{
|
||||
$this->model = $model;
|
||||
}
|
||||
|
||||
public function collection()
|
||||
{
|
||||
return $this->model::all();
|
||||
}
|
||||
|
||||
public function map($row)
|
||||
: array
|
||||
{
|
||||
return [
|
||||
$row->id,
|
||||
$row->code,
|
||||
$row->name,
|
||||
$row->created_at
|
||||
];
|
||||
}
|
||||
|
||||
public function headings()
|
||||
: array
|
||||
{
|
||||
return [
|
||||
'ID',
|
||||
'Code',
|
||||
'Name',
|
||||
'Created At'
|
||||
];
|
||||
}
|
||||
|
||||
public function columnFormats()
|
||||
: array
|
||||
{
|
||||
return [
|
||||
'A' => NumberFormat::FORMAT_NUMBER,
|
||||
'D' => NumberFormat::FORMAT_DATE_DATETIME
|
||||
];
|
||||
}
|
||||
}
|
||||
49
app/Exports/CustomFieldExport.php
Normal file
49
app/Exports/CustomFieldExport.php
Normal file
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Exports;
|
||||
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use Modules\Lpj\Models\CustomField;
|
||||
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
|
||||
|
||||
class CustomFieldExport implements WithColumnFormatting, WithHeadings, FromCollection, WithMapping
|
||||
{
|
||||
public function collection()
|
||||
{
|
||||
return CustomField::all();
|
||||
}
|
||||
|
||||
public function map($row): array
|
||||
{
|
||||
return [
|
||||
$row->id,
|
||||
$row->name,
|
||||
$row->type,
|
||||
$row->created_at,
|
||||
$row->updated_at,
|
||||
];
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
'ID',
|
||||
'Name',
|
||||
'Type',
|
||||
'Created At',
|
||||
'Updated At',
|
||||
];
|
||||
}
|
||||
|
||||
public function columnFormats(): array
|
||||
{
|
||||
return [
|
||||
'A' => NumberFormat::FORMAT_NUMBER,
|
||||
'D' => NumberFormat::FORMAT_DATE_DDMMYYYY,
|
||||
'E' => NumberFormat::FORMAT_DATE_DDMMYYYY,
|
||||
];
|
||||
}
|
||||
}
|
||||
46
app/Exports/JenisLampiranExport.php
Normal file
46
app/Exports/JenisLampiranExport.php
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\app\Exports;
|
||||
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
|
||||
use Modules\Lpj\app\Models\JenisLampiran;
|
||||
|
||||
class JenisLampiranExport implements WithColumnFormatting, WithHeadings, FromCollection, WithMapping
|
||||
{
|
||||
public function collection()
|
||||
{
|
||||
return JenisLampiran::all();
|
||||
}
|
||||
|
||||
public function map($row): array
|
||||
{
|
||||
return [
|
||||
$row->id,
|
||||
$row->nama,
|
||||
$row->deskripsi,
|
||||
$row->created_at
|
||||
];
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
'ID',
|
||||
'Nama',
|
||||
'Deskripsi',
|
||||
'Created At'
|
||||
];
|
||||
}
|
||||
|
||||
public function columnFormats(): array
|
||||
{
|
||||
return [
|
||||
'A' => NumberFormat::FORMAT_NUMBER,
|
||||
'D' => NumberFormat::FORMAT_DATE_DATETIME
|
||||
];
|
||||
}
|
||||
}
|
||||
339
app/Exports/KertasKerjaExport.php
Normal file
339
app/Exports/KertasKerjaExport.php
Normal file
@@ -0,0 +1,339 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Exports;
|
||||
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithStyles;
|
||||
use Maatwebsite\Excel\Concerns\WithColumnWidths;
|
||||
use Maatwebsite\Excel\Concerns\WithEvents;
|
||||
use Maatwebsite\Excel\Events\AfterSheet;
|
||||
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
||||
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
|
||||
|
||||
class KertasKerjaExport implements FromCollection, WithHeadings, WithStyles, WithColumnWidths, WithEvents
|
||||
{
|
||||
// use Illuminate\Contracts\View\View;
|
||||
// use Maatwebsite\Excel\Concerns\FromView;
|
||||
// class KertasKerjaExport implements FromView
|
||||
// {
|
||||
|
||||
protected $data;
|
||||
|
||||
public function __construct($data)
|
||||
{
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
// public function view(): View
|
||||
// {
|
||||
// return view('lpj::component.kertas-kerja', [
|
||||
// 'data' => $this->data,
|
||||
// ]);
|
||||
// }
|
||||
|
||||
public function collection()
|
||||
{
|
||||
// $rows = [];
|
||||
|
||||
// $nomor = 1;
|
||||
$fields = [
|
||||
'jenis_aset' => 'Jenis Aset',
|
||||
'luas_tanah' => 'Luas Tanah (M²)',
|
||||
'luas_bangunan' => 'Luas Bangunan (M²)',
|
||||
'harga' => 'Harga Transaksi/Penawaran',
|
||||
'tanggal_penawaran' => 'Tanggal Penawaran/Transaksi',
|
||||
'diskon' => 'Diskon %',
|
||||
'esitmasi_harga' => 'Esitmasi Harga Transaksi (Rp)',
|
||||
'no_telepon' => 'Telepon Contact Person',
|
||||
'nama_nara_sumbr' => 'Nama Nara Sumber',
|
||||
'status_nara_sumbr' => 'Status Nara Sumber',
|
||||
'waktu_transaksi' => 'Waktu Transaksi/Penawaran',
|
||||
'alamat' => 'Alamat Titik Gps',
|
||||
|
||||
'jalan' => 'Jalan',
|
||||
'desa' => 'Desa/Kelurahan',
|
||||
'kecamatan' => 'Kecamatan',
|
||||
'kabupaten' => 'Kabupaten',
|
||||
'provinsi' => 'Provinsi',
|
||||
|
||||
'jarak_pembanding' => 'Jarak Pembanding dengan Objek',
|
||||
'elevasi' => 'Estimasi Ranking Tanah',
|
||||
'peruntukan' => 'Estiamsi Rangkin Bangunan'
|
||||
|
||||
];
|
||||
|
||||
$rows = [];
|
||||
$nomor = 1;
|
||||
|
||||
// Add general asset information
|
||||
$rows[] = ['No.', 'Uraian', 'Objek Penilaian', 'Data Pembanding 1', 'Data Pembanding 2', 'Data Pembanding 3'];
|
||||
|
||||
foreach ($this->data['objek'] as $key => $value) {
|
||||
$rows[] = [
|
||||
$nomor++,
|
||||
$key,
|
||||
$value,
|
||||
$this->data['pembanding1'][$key] ?? '',
|
||||
$this->data['pembanding2'][$key] ?? '',
|
||||
$this->data['pembanding3'][$key] ?? ''
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
// B. Perhitungan Penyesuaian
|
||||
$rows[] = [''];
|
||||
$rows[] = [''];
|
||||
$rows[] = ['B. Estimasi Nilai Tanah Pembanding dengan Teknik Penyisaan Tanah untuk mendapatkan per meter persegi estimasi Nilai Tanah Pembanding'];
|
||||
$rows[] = ['No.','Uraian', 'Objek Penilaian', 'Data Pembanding 1', 'Data Pembanding 2', 'Data Pembanding 3'];
|
||||
$nostimasi = 1;
|
||||
$filedEstimasi = [
|
||||
'estimasi' => 'Estimasi Biaya Pengganti Baru Bangunan (Rp)',
|
||||
'estimasi_spl' => 'Estimasi Biaya Pengganti Baru SPL (Rp)',
|
||||
'penyusutan' => 'Penyusutan Fisik Banguna',
|
||||
|
||||
'a' => 'a. rincian ttipe bangunan (MAPPI)',
|
||||
'b' => 'b. umur ekonomis (MAPPI)',
|
||||
'c' => 'c. estimasi Tahun tahun visual dengan mempertimbangkan renovasi',
|
||||
'd' => 'd. Sehingga sisa umur efektif',
|
||||
'e' => 'e. kondisi bagunan',
|
||||
'f' => 'f.sehinggan penyusutan fisik',
|
||||
'penyusutan_fungsi' => 'Penyusutan fungsi Bangunan (%)',
|
||||
'penyusutan_ekonomi' => 'Penyusutan Ekonomi Bangunan (%)',
|
||||
'total_penyusutan' => 'Total Penyusutan (%)',
|
||||
'estimasi_nilai' => 'Estimasi Nilai Bangunan dan SPL (Rp)',
|
||||
'estimasi_tanah' => 'Estimasi Nilai Tanah Pembanding (Rp)',
|
||||
'estimasi_nilai' => 'Estimasi Nilai Tanah Pembanding (Rp)',
|
||||
];
|
||||
|
||||
foreach ($filedEstimasi as $key => $label) {
|
||||
$rows[] = [
|
||||
$nostimasi++,
|
||||
$label,
|
||||
$this->data['estimasi'][$key] ?? '',
|
||||
$this->data['estimasi1'][$key] ?? '',
|
||||
$this->data['estimasi2'][$key] ?? '',
|
||||
$this->data['estimasi3'][$key] ?? ''
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
$row[] = [''];
|
||||
$row[] = [''];
|
||||
$rows[] = ['INDIKASI NILAI TANAHATAS OBJEK PENILAIAN'];
|
||||
|
||||
$indikasi=[
|
||||
'luas_tanah' => 'Luas Tanah ',
|
||||
'indikasi_per' => 'INDIKASI TANAH PER M2 (RP/M2)',
|
||||
'indikasi_total' => 'INDIKASI TANAH TOTAL(RP)',
|
||||
'varian' => 'VARIANT(%)',
|
||||
];
|
||||
|
||||
foreach ($indikasi as $key => $label) {
|
||||
$rows[] = [
|
||||
$label,
|
||||
$this->data['indikasi'][$key] ?? '',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
// C. Peta Lokasi
|
||||
$rows[] = [''];
|
||||
$rows[] = [''];
|
||||
$rows[] = ['C. Peta Lokasi'];
|
||||
$rows[] = [$this->data['foto_objek']['foto_objek_peta'] ?? ''];
|
||||
|
||||
// D. Foto Objek dan Data Pembanding
|
||||
$rows[] = [''];
|
||||
$rows[] = ['D. Foto Objek dan Data Pembanding'];
|
||||
$rows[] = [
|
||||
$this->data['foto_objek1']['foto_objek'] ?? '',
|
||||
$this->data['foto_objek2']['foto_objek'] ?? '',
|
||||
'', '', ''
|
||||
];
|
||||
|
||||
// E. Foto Objek
|
||||
$rows[] = [''];
|
||||
$rows[] = ['E. Foto Objek'];
|
||||
$rows[] = [
|
||||
$this->data['foto']['foto_objek'] ?? '',
|
||||
$this->data['foto']['foto_objek'] ?? '',
|
||||
'', '', ''
|
||||
];
|
||||
|
||||
return collect($rows);
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
['KERTAS KERJA PENILAIAN'],
|
||||
['Pendekatan Pasar'],
|
||||
['Metode Perbandingan Data Pasar'],
|
||||
['Tanggal Penilaian: ' . ($this->headerInfo['tanggal_penilaian'] ?? '')],
|
||||
['Nama Pemilik Aset: ' . ($this->headerInfo['nama_pemilik'] ?? '')],
|
||||
['Nama Pemberi Tugas: ' . ($this->headerInfo['nama_pemberi_tugas'] ?? '')],
|
||||
['Lokasi: ' . ($this->headerInfo['lokasi_lengkap'] ?? '')],
|
||||
|
||||
];
|
||||
}
|
||||
public function registerEvents(): array
|
||||
{
|
||||
return [
|
||||
AfterSheet::class => function (AfterSheet $event) {
|
||||
// Styling untuk header utama
|
||||
|
||||
|
||||
// Styling untuk setiap section header
|
||||
$sectionRows = [10, 34, 56, 46, 52]; // Sesuaikan dengan posisi setiap section
|
||||
foreach ($sectionRows as $row) {
|
||||
$event->sheet->getStyle("A{$row}:F{$row}")->getFill()
|
||||
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
|
||||
->getStartColor()->setRGB('E2EFDA');
|
||||
}
|
||||
|
||||
// Merge cells untuk headers
|
||||
$event->sheet->mergeCells('A1:E1');
|
||||
$event->sheet->mergeCells('A2:E2');
|
||||
$event->sheet->mergeCells('A4:E4');
|
||||
$event->sheet->mergeCells('A5:E5');
|
||||
$event->sheet->mergeCells('A6:E6');
|
||||
$event->sheet->mergeCells('A7:E7');
|
||||
$event->sheet->mergeCells('A8:E8');
|
||||
|
||||
// Alignment
|
||||
$event->sheet->getStyle('A1:E8')->getAlignment()
|
||||
->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT);
|
||||
$this->insertImages($event->sheet);
|
||||
}
|
||||
];
|
||||
}
|
||||
public function columnWidths(): array
|
||||
{
|
||||
return [
|
||||
'A' => 5,
|
||||
'B' => 30,
|
||||
'C' => 30,
|
||||
'D' => 30,
|
||||
'E' => 30,
|
||||
'F' => 30,
|
||||
];
|
||||
}
|
||||
|
||||
public function styles(Worksheet $sheet)
|
||||
{
|
||||
return [
|
||||
// Style for the main header
|
||||
|
||||
// Style for section headers
|
||||
10 => ['font' => ['bold' => true]], // A. Informasi Umum
|
||||
34 => ['font' => ['bold' => true]], // B. Estimasi Nilai Tanah
|
||||
35 => ['font' => ['bold' => true]], // C. Peta Lokasi
|
||||
57 => ['font' => ['bold' => true]], // D. Foto Objek dan Pembanding
|
||||
60 => ['font' => ['bold' => true]], // E. Foto Objek
|
||||
|
||||
// Default styling for columns
|
||||
'A:J' => [
|
||||
'alignment' => ['horizontal' => 'left', 'vertical' => 'center'],
|
||||
'wrapText' => true,
|
||||
],
|
||||
|
||||
// Style for other sections (like photo and map sections)
|
||||
|
||||
// Style for the other headers
|
||||
'A11:F11' => [
|
||||
'font' => ['bold' => true],
|
||||
'fill' => ['fillType' => 'solid', 'color' => ['rgb' => 'E2EFDA']],
|
||||
'borders' => [
|
||||
'allBorders' => [
|
||||
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN
|
||||
]
|
||||
]
|
||||
],
|
||||
'A12:F31' => [
|
||||
'borders' => [
|
||||
'allBorders' => [
|
||||
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN
|
||||
]
|
||||
]
|
||||
],
|
||||
|
||||
|
||||
'A35:F35' => [
|
||||
'font' => ['bold' => true],
|
||||
'fill' => ['fillType' => 'solid', 'color' => ['rgb' => 'E2EFDA']],
|
||||
'borders' => [
|
||||
'allBorders' => [
|
||||
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN
|
||||
]
|
||||
]
|
||||
],
|
||||
'A35:F49' => [
|
||||
'borders' => [
|
||||
'allBorders' => [
|
||||
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN
|
||||
]
|
||||
]
|
||||
],
|
||||
|
||||
// end header
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
protected function insertImages($sheet)
|
||||
{
|
||||
ini_set('max_execution_time', '300');
|
||||
|
||||
$worksheet = $sheet->getDelegate();
|
||||
|
||||
// Insert images for pembanding1
|
||||
if (!empty($this->data['pembanding1']['foto_objek'])) {
|
||||
$drawing = new Drawing();
|
||||
$drawing->setName('Pembanding 1');
|
||||
$drawing->setDescription('Foto Objek Pembanding 1');
|
||||
$drawing->setPath(storage_path('app/public/' . $this->data['pembanding1']['foto_objek'])); // Adjust path as needed
|
||||
$drawing->setHeight(90);
|
||||
$drawing->setCoordinates('C' . (count($this->collection()) + 2)); // Adjust coordinates as needed
|
||||
$drawing->setWorksheet($worksheet);
|
||||
}
|
||||
|
||||
// Repeat for pembanding2 and pembanding3
|
||||
if (!empty($this->data['pembanding2']['foto_objek'])) {
|
||||
$drawing = new Drawing();
|
||||
$drawing->setName('Pembanding 2');
|
||||
$drawing->setDescription('Foto Objek Pembanding 2');
|
||||
$drawing->setPath(storage_path('app/public/' . $this->data['pembanding2']['foto_objek'])); // Adjust path as needed
|
||||
$drawing->setHeight(90);
|
||||
$drawing->setCoordinates('C' . (count($this->collection()) + 4)); // Adjust coordinates as needed
|
||||
$drawing->setWorksheet($worksheet);
|
||||
}
|
||||
|
||||
if (!empty($this->data['pembanding3']['foto_objek'])) {
|
||||
$drawing = new Drawing();
|
||||
$drawing->setName('Pembanding 3');
|
||||
$drawing->setDescription('Foto Objek Pembanding 3');
|
||||
$drawing->setPath(storage_path('app/public/' . $this->data['pembanding3']['foto_objek'])); // Adjust path as needed
|
||||
$drawing->setHeight(90);
|
||||
$drawing->setCoordinates('C' . (count($this->collection()) + 6)); // Adjust coordinates as needed
|
||||
$drawing->setWorksheet($worksheet);
|
||||
}
|
||||
|
||||
// Insert images for foto_objek
|
||||
foreach ($this->data['foto_objek'] as $index => $foto) {
|
||||
if (!empty($foto['foto_objek'])) {
|
||||
$drawing = new Drawing();
|
||||
$drawing->setName($foto['name_objek']);
|
||||
$drawing->setDescription($foto['deskripsi_objek']);
|
||||
$drawing->setPath(storage_path('app/public/' . $foto['foto_objek'])); // Adjust path as needed
|
||||
$drawing->setHeight(90);
|
||||
$drawing->setCoordinates('C' . (count($this->collection()) + (8 + $index * 2))); // Adjust coordinates as needed
|
||||
$drawing->setWorksheet($worksheet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
76
app/Exports/LaporanAdminKreditExport.php
Normal file
76
app/Exports/LaporanAdminKreditExport.php
Normal file
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Exports;
|
||||
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use Modules\Lpj\Models\LaporanAdminKredit;
|
||||
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
|
||||
|
||||
class LaporanAdminKreditExport implements WithColumnFormatting, WithHeadings, FromCollection, WithMapping
|
||||
{
|
||||
public function collection()
|
||||
{
|
||||
return LaporanAdminKredit::with('debiture')->get();
|
||||
}
|
||||
|
||||
public function map($row): array
|
||||
{
|
||||
return [
|
||||
$row->id,
|
||||
$row->debiture->cif,
|
||||
$row->debiture->name,
|
||||
$row->debiture->branch->name,
|
||||
$row->kode_register_t24,
|
||||
$row->jenis_agunan,
|
||||
$row->bukti_kepemilikan,
|
||||
$row->alamat_agunan,
|
||||
$row->nama_pemilik,
|
||||
$row->tanggal_kunjungan,
|
||||
$row->nilai_pasar_wajar,
|
||||
$row->nilai_likuidasi,
|
||||
$row->nama_penilai,
|
||||
$row->kolektibilitas,
|
||||
$row->keterangan,
|
||||
$row->created_at
|
||||
];
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
'ID',
|
||||
'CIF',
|
||||
'Nama Debitur',
|
||||
'Cabang',
|
||||
'Kode Register T24',
|
||||
'Jenis Agunan',
|
||||
'Bukti Kepemilikan',
|
||||
'Alamat Agunan',
|
||||
'Nama Pemilik',
|
||||
'Tanggal Kunjungan',
|
||||
'Nilai Pasar Wajar',
|
||||
'Nilai Likuidasi',
|
||||
'Nama Penilai',
|
||||
'Kolektibilitas',
|
||||
'Keterangan',
|
||||
'Created At'
|
||||
];
|
||||
}
|
||||
|
||||
public function columnFormats(): array
|
||||
{
|
||||
return [
|
||||
'A' => NumberFormat::FORMAT_NUMBER,
|
||||
'B' => NumberFormat::FORMAT_NUMBER,
|
||||
'J' => NumberFormat::FORMAT_DATE_DDMMYYYY,
|
||||
'K' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1,
|
||||
'L' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1,
|
||||
'N' => NumberFormat::FORMAT_TEXT, // Kolektibilitas
|
||||
'O' => NumberFormat::FORMAT_TEXT, // Keterangan
|
||||
'P' => NumberFormat::FORMAT_DATE_DATETIME, // Created At (moved from M to P)
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,288 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Exports;
|
||||
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use Maatwebsite\Excel\Concerns\WithTitle;
|
||||
use Maatwebsite\Excel\Concerns\WithCustomStartCell;
|
||||
use Maatwebsite\Excel\Concerns\WithEvents;
|
||||
use Maatwebsite\Excel\Events\AfterSheet;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\Branch;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Carbon\Carbon;
|
||||
|
||||
class LaporanHasilPenilaianJaminanInternalExternalExport implements FromCollection, WithHeadings, WithMapping, WithTitle, WithCustomStartCell, WithEvents
|
||||
{
|
||||
protected $request;
|
||||
|
||||
public function __construct($request)
|
||||
{
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
public function collection()
|
||||
{
|
||||
$query = Permohonan::query();
|
||||
$query = $query->where('status', 'done');
|
||||
|
||||
// Apply date range filter if provided
|
||||
if ($this->request->has('start_date') || $this->request->has('end_date')) {
|
||||
$query->whereBetween('tanggal_permohonan', [
|
||||
$this->request->start_date ?? '1900-01-01',
|
||||
$this->request->end_date ?? now()->toDateString()
|
||||
]);
|
||||
}
|
||||
|
||||
// Apply branch filter if provided
|
||||
if ($this->request->has('branch_id') && !empty($this->request->branch_id)) {
|
||||
$query->where('branch_id', $this->request->branch_id);
|
||||
}
|
||||
|
||||
if ($this->request->has('penilai_id') && !empty($this->request->penilai_id)) {
|
||||
$request = $this->request; // Store in a local variable
|
||||
$query->whereHas('penilaian._user_penilai.userPenilaiTeam', function($q) use ($request) {
|
||||
$q->where('user_id', $request->penilai_id);
|
||||
});
|
||||
}
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($this->request->has('search') && !empty($this->request->search)) {
|
||||
$search = $this->request->search;
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Default ordering
|
||||
$query->orderBy('nomor_registrasi', 'asc');
|
||||
|
||||
return $query->get();
|
||||
}
|
||||
|
||||
protected $rowNumber = 0;
|
||||
|
||||
public function map($permohonan): array
|
||||
{
|
||||
$this->rowNumber++;
|
||||
$luas_tanah = 0;
|
||||
$luas_bangunan = 0;
|
||||
$nilai_tanah = 0;
|
||||
$nilai_bangunan = 0;
|
||||
$npw = 0;
|
||||
$nilai_liquidasi = 0;
|
||||
|
||||
if (isset($permohonan->penilai->lpj)) {
|
||||
$lpj = json_decode($permohonan->penilai->lpj, true);
|
||||
$npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0);
|
||||
|
||||
$luas_tanah = $lpj['luas_tanah'] ?? 0;
|
||||
$luas_bangunan = $lpj['luas_bangunan'] ?? 0;
|
||||
$nilai_tanah = str_replace('.', '', $lpj['nilai_tanah_2'] ?? 0);
|
||||
$nilai_bangunan = str_replace('.', '', $lpj['nilai_bangunan_2'] ?? 0);
|
||||
$nilai_liquidasi = str_replace('.', '', $lpj['likuidasi_nilai_2'] ?? 0);
|
||||
}
|
||||
|
||||
return [
|
||||
$this->rowNumber,
|
||||
$permohonan->nomor_registrasi,
|
||||
$permohonan->tanggal_permohonan,
|
||||
$permohonan->debiture->branch->name,
|
||||
$permohonan->creator->name,
|
||||
$permohonan->debiture->cif,
|
||||
$permohonan->debiture->name,
|
||||
$permohonan->jenisPenilaian->name,
|
||||
$permohonan->tujuanPenilaian->name,
|
||||
$permohonan->jenisFasilitasKredit->name,
|
||||
$permohonan->documents->pluck('jenisJaminan.name')->unique()->implode(', '),
|
||||
$permohonan->documents->map(function ($document) {
|
||||
return formatAlamat($document);
|
||||
})->unique()->implode(', '),
|
||||
$permohonan->documents->flatMap(function ($document) {
|
||||
return $document->detail->map(function ($detail) {
|
||||
return (!empty($detail->dokumen_nomor) && is_array($detail->dokumen_nomor))
|
||||
? ($detail->jenisLegalitasJaminan->name ?? '') . "\n" . implode(', ', $detail->dokumen_nomor)
|
||||
: null;
|
||||
});
|
||||
})->filter()->unique()->implode(', '),
|
||||
$permohonan->documents->pluck('pemilik.name')->unique()->implode(', '),
|
||||
$luas_tanah . ' m²',
|
||||
formatRupiah($nilai_tanah, 2),
|
||||
$luas_bangunan . ' m²',
|
||||
formatRupiah($nilai_bangunan, 2),
|
||||
formatRupiah($permohonan->nilai_njop ?? 0, 2),
|
||||
formatRupiah($npw, 2),
|
||||
formatRupiah($nilai_liquidasi, 2),
|
||||
$permohonan->documents->map(function ($document) {
|
||||
return formatTanggalIndonesia($document->created_at);
|
||||
})->first(),
|
||||
'', // tanggal_spk
|
||||
'', // nomor_spk
|
||||
'', // tanggal_rencana_kunjungan
|
||||
$permohonan->penilaian->tanggal_kunjungan ? formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan) : '',
|
||||
'', // tanggal_delivered
|
||||
'', // jangka_waktu_sla
|
||||
($permohonan->approval_dd_at || $permohonan->approval_eo_at) ?
|
||||
formatTanggalIndonesia($permohonan->approval_dd_at ?? $permohonan->approval_eo_at) : '',
|
||||
$permohonan->penilaian->tanggal_kunjungan ? formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan) : '',
|
||||
$permohonan->penilaian->_user_penilai->userPenilaiTeam->name ?? '',
|
||||
$permohonan->penilaian->teams ?? '',
|
||||
'', // saran
|
||||
'' // catatan
|
||||
];
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
'No',
|
||||
'Nomor Registrasi',
|
||||
'Tanggal Permohonan',
|
||||
'Cabang',
|
||||
'Pemohon',
|
||||
'CIF',
|
||||
'Nama Debitur',
|
||||
'Jenis Penilaian',
|
||||
'Tujuan Penilaian',
|
||||
'Jenis Fasilitas Kredit',
|
||||
'Jenis Agunan',
|
||||
'Alamat Agunan',
|
||||
'Bukti Kepemilikan',
|
||||
'Nama Pemilik',
|
||||
'Luas Tanah',
|
||||
'Nilai Tanah',
|
||||
'Luas Bangunan',
|
||||
'Nilai Bangunan',
|
||||
'Nilai NJOP',
|
||||
'Nilai Pasar Wajar',
|
||||
'Nilai Likuidasi',
|
||||
'Tanggal Dokumen Diterima',
|
||||
'Tanggal SPK',
|
||||
'Nomor SPK',
|
||||
'Tanggal Rencana Kunjungan',
|
||||
'Tanggal Kunjungan',
|
||||
'Tanggal Delivered',
|
||||
'Jangka Waktu SLA',
|
||||
'Tanggal Laporan',
|
||||
'Tanggal Review',
|
||||
'Nama Penilai',
|
||||
'Nama Team Leader',
|
||||
'Saran',
|
||||
'Catatan'
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function title(): string
|
||||
{
|
||||
return 'Laporan Hasil Penilaian Jaminan Internal & External';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function startCell(): string
|
||||
{
|
||||
return 'A7';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function registerEvents(): array
|
||||
{
|
||||
return [
|
||||
AfterSheet::class => function(AfterSheet $event) {
|
||||
// Get the sheet
|
||||
$sheet = $event->sheet->getDelegate();
|
||||
|
||||
// Set the title
|
||||
$sheet->setCellValue('A1', 'LAPORAN PENILAIAN JAMINAN');
|
||||
$sheet->getStyle('A1')->getFont()->setBold(true)->setSize(16);
|
||||
|
||||
// Merge cells for title
|
||||
$sheet->mergeCells('A1:AH1');
|
||||
$sheet->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
|
||||
|
||||
// Set the branch information if filtered
|
||||
$branchInfo = '';
|
||||
if ($this->request->has('branch_id') && !empty($this->request->branch_id)) {
|
||||
$branch = Branch::find($this->request->branch_id);
|
||||
if ($branch) {
|
||||
$branchInfo = 'Cabang: ' . $branch->name;
|
||||
$sheet->setCellValue('A2', $branchInfo);
|
||||
$sheet->mergeCells('A2:AH2');
|
||||
$sheet->getStyle('A2')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
|
||||
$sheet->getStyle('A2')->getFont()->setBold(true);
|
||||
}
|
||||
}
|
||||
|
||||
// Set the period
|
||||
$startDate = $this->request->start_date ?? '';
|
||||
$endDate = $this->request->end_date ?? '';
|
||||
|
||||
$rowIndex = $branchInfo ? 3 : 2;
|
||||
|
||||
if ($startDate && $endDate) {
|
||||
$startDateFormatted = Carbon::parse($startDate)->format('d F Y');
|
||||
$endDateFormatted = Carbon::parse($endDate)->format('d F Y');
|
||||
$sheet->setCellValue('A' . $rowIndex, 'Periode: ' . $startDateFormatted . ' - ' . $endDateFormatted);
|
||||
} else {
|
||||
$sheet->setCellValue('A' . $rowIndex, 'Periode: Semua Data');
|
||||
}
|
||||
$sheet->mergeCells('A' . $rowIndex . ':AH' . $rowIndex);
|
||||
$sheet->getStyle('A' . $rowIndex)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
|
||||
|
||||
// Set the date of export
|
||||
$rowIndex++;
|
||||
$sheet->setCellValue('A' . $rowIndex, 'Tanggal Export: ' . Carbon::now()->format('d F Y H:i:s'));
|
||||
|
||||
// Set the user who exported
|
||||
$rowIndex++;
|
||||
$userName = Auth::user() ? Auth::user()->name : 'System';
|
||||
$sheet->setCellValue('A' . $rowIndex, 'Diexport oleh: ' . $userName);
|
||||
|
||||
// Add a blank line
|
||||
$rowIndex++;
|
||||
$sheet->setCellValue('A' . $rowIndex, '');
|
||||
|
||||
// Style the header row
|
||||
$headerRange = 'A7:' . $sheet->getHighestColumn() . '7';
|
||||
$sheet->getStyle($headerRange)->getFont()->setBold(true);
|
||||
$sheet->getStyle($headerRange)->getFill()
|
||||
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
|
||||
->getStartColor()->setARGB('FFCCCCCC');
|
||||
|
||||
// Auto-size columns - fixed to handle columns beyond Z
|
||||
$highestColumn = $sheet->getHighestColumn();
|
||||
$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
|
||||
|
||||
for ($i = 1; $i <= $highestColumnIndex; $i++) {
|
||||
$currentColumn = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($i);
|
||||
$sheet->getColumnDimension($currentColumn)->setAutoSize(true);
|
||||
}
|
||||
|
||||
// Add borders to all cells with data
|
||||
$dataRange = 'A7:' . $sheet->getHighestColumn() . $sheet->getHighestRow();
|
||||
$sheet->getStyle($dataRange)->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
|
||||
|
||||
// Center align the header row
|
||||
$sheet->getStyle($headerRange)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
|
||||
|
||||
// Set text wrap for header cells
|
||||
$sheet->getStyle($headerRange)->getAlignment()->setWrapText(true);
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
102
app/Exports/LaporanPembatalanExport.php
Normal file
102
app/Exports/LaporanPembatalanExport.php
Normal file
@@ -0,0 +1,102 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Exports;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use Modules\Lpj\Models\PermohonanPembatalan;
|
||||
|
||||
class LaporanPembatalanExport implements FromCollection, WithHeadings, WithMapping
|
||||
{
|
||||
protected $request;
|
||||
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
public function collection()
|
||||
{
|
||||
$query = PermohonanPembatalan::where('status', 'batal');
|
||||
|
||||
if (!Auth::user()->hasAnyRole(['administrator'])) {
|
||||
$query = $query->whereHas('permohonan', function ($q) {
|
||||
$q->where('branch_id', Auth::user()->branch_id);
|
||||
});
|
||||
}
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($this->request->has('search') && !empty($this->request->get('search'))) {
|
||||
$search = $this->request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->whereHas('permohonan', function ($subq) use ($search) {
|
||||
$subq->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$subq->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%');
|
||||
$subq->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
$q->orWhere('alasan', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Filter by date range if provided
|
||||
if ($this->request->has('start_date') || $this->request->has('end_date')) {
|
||||
$query->whereBetween('created_at', [
|
||||
$this->request->get('start_date') ?? '1900-01-01',
|
||||
$this->request->get('end_date') ?? now()->toDateString()
|
||||
]);
|
||||
}
|
||||
|
||||
// Filter by status if provided
|
||||
if ($this->request->has('status') && !empty($this->request->get('status'))) {
|
||||
$query->where('status', $this->request->get('status'));
|
||||
}
|
||||
|
||||
// Filter by branch if provided
|
||||
if ($this->request->has('branch_id') && !empty($this->request->get('branch_id'))) {
|
||||
$query->whereHas('permohonan', function ($q) {
|
||||
$q->where('branch_id', $this->request->get('branch_id'));
|
||||
});
|
||||
}
|
||||
|
||||
return $query->orderBy('created_at', 'desc')
|
||||
->get();
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
'No. Registrasi',
|
||||
'Tanggal Permohonan',
|
||||
'Tanggal Pembatalan',
|
||||
'Cabang',
|
||||
'Pemohon',
|
||||
'Debitur',
|
||||
'Alasan Pembatalan',
|
||||
'Status',
|
||||
'Diajukan Oleh',
|
||||
'Disetujui Oleh',
|
||||
'Tanggal Disetujui'
|
||||
];
|
||||
}
|
||||
|
||||
public function map($pembatalan): array
|
||||
{
|
||||
return [
|
||||
$pembatalan->permohonan->nomor_registrasi ?? '-',
|
||||
$pembatalan->permohonan->tanggal_permohonan ? date('d-m-Y', strtotime($pembatalan->permohonan->tanggal_permohonan)) : '-',
|
||||
date('d-m-Y', strtotime($pembatalan->created_at)),
|
||||
$pembatalan->permohonan->branch->name ?? '-',
|
||||
$pembatalan->permohonan->user->name ?? '-',
|
||||
$pembatalan->permohonan->debiture->name ?? '-',
|
||||
$pembatalan->alasan_pembatalan,
|
||||
$pembatalan->status,
|
||||
$pembatalan->user->name ?? '-',
|
||||
$pembatalan->authorized_by ? $pembatalan->authorizedUser->name : '-',
|
||||
$pembatalan->authorized_at ? formatTanggalIndonesia(strtotime($pembatalan->authorized_at),1) : '-'
|
||||
];
|
||||
}
|
||||
}
|
||||
177
app/Exports/LaporanPenilaiJaminanExport.php
Normal file
177
app/Exports/LaporanPenilaiJaminanExport.php
Normal file
@@ -0,0 +1,177 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Exports;
|
||||
|
||||
use Maatwebsite\Excel\Concerns\FromQuery;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
|
||||
use Modules\Lpj\Models\Debiture;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Helpers\Lpj;
|
||||
|
||||
class LaporanPenilaiJaminanExport implements FromQuery, WithHeadings, WithMapping, ShouldAutoSize
|
||||
{
|
||||
protected $tanggalAwal;
|
||||
protected $tanggalAkhir;
|
||||
protected $status;
|
||||
protected $selectedIds;
|
||||
|
||||
public function __construct($tanggalAwal = null, $tanggalAkhir = null, $status = null, $selectedIds = null)
|
||||
{
|
||||
$this->tanggalAwal = $tanggalAwal;
|
||||
$this->tanggalAkhir = $tanggalAkhir;
|
||||
$this->status = $status;
|
||||
$this->selectedIds = $selectedIds;
|
||||
}
|
||||
|
||||
|
||||
public function query()
|
||||
{
|
||||
$query = Permohonan::query()
|
||||
->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan.jenisJaminan','nilaiPlafond', 'penilai', 'inspeksi']);
|
||||
|
||||
// Filter by date range if provided
|
||||
if ($this->tanggalAwal && $this->tanggalAkhir) {
|
||||
$query->whereBetween('tanggal_permohonan', [$this->tanggalAwal, $this->tanggalAkhir]);
|
||||
}
|
||||
|
||||
$query->where('status', 'done');
|
||||
// Filter by status if provided
|
||||
if ($this->status) {
|
||||
$types = is_array($this->status) ? $this->status : [$this->status];
|
||||
$types = array_map('strtolower', $types);
|
||||
$query->whereHas('penilai', function (Builder $query) use ($types) {
|
||||
$query->whereIn('type_penilai', $types);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// Filter by selected IDs if provided
|
||||
if ($this->selectedIds) {
|
||||
$selectedIds = is_array($this->selectedIds) ? $this->selectedIds : explode(',', $this->selectedIds);
|
||||
$query->whereIn('id', $selectedIds);
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
|
||||
public function map($row): array
|
||||
{
|
||||
|
||||
// ambil data alamat dari inspeksi
|
||||
$alamat_inspeksi = null;
|
||||
|
||||
if ($row->inspeksi) {
|
||||
$alamat_inspeksi = json_decode($row->inspeksi->data_form, true) ?? null;
|
||||
$alamat_inspeksi = $alamat_inspeksi['asset']['alamat']['sesuai'] ?? $alamat_inspeksi['asset']['alamat']['tidak sesuai'] ?? [];
|
||||
}
|
||||
$alamat_inspeksi = $alamat_inspeksi['address'] ?? '-';
|
||||
|
||||
|
||||
// ambil data dari table penilai
|
||||
$fieldPenilai = ['lpj', 'resume', 'memo', 'rap', 'call-report'];
|
||||
$penilaiCek = null;
|
||||
|
||||
// Cari field yang tersedia
|
||||
foreach ($fieldPenilai as $value) {
|
||||
if (!empty($row->penilai->$value)) {
|
||||
$penilaiCek = $row->penilai->$value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$decodePenilai = json_decode($penilaiCek, true) ?? [];
|
||||
// Ambil nilai utama
|
||||
$luasTanah = $decodePenilai['luas_tanah'] ?? 0;
|
||||
$nilaiTanah1 = $decodePenilai['nilai_tanah_1'] ?? 0;
|
||||
$luasBangunan = $decodePenilai['luas_bangunan'] ?? 0;
|
||||
$nilaiBangunan1 = $decodePenilai['nilai_bangunan_1'] ?? 0;
|
||||
$totalNilaiPasar = $decodePenilai['total_nilai_pasar_wajar'] ?? 0;
|
||||
$likuidasi = $decodePenilai['likuidasi'] ?? 0;
|
||||
|
||||
// Ambil data npw_tambahan jika ada
|
||||
$npwTambahan = $decodePenilai['npw_tambahan'] ?? [];
|
||||
$tambahanDetails = [];
|
||||
foreach ($npwTambahan as $tambahan) {
|
||||
$tambahanDetails[] = sprintf(
|
||||
'%s: Luas: %s, Nilai 1: %s, Nilai 2: %s',
|
||||
$tambahan['name'] ?? '-',
|
||||
$tambahan['luas'] ?? 0,
|
||||
$tambahan['nilai_1'] ?? 0,
|
||||
$tambahan['nilai_2'] ?? 0
|
||||
);
|
||||
}
|
||||
$tambahanSummary = implode("; ", $tambahanDetails);
|
||||
|
||||
// Ambil data penilaian dari table penilaian
|
||||
$user_penilai = $row->penilaian->userPenilai ?? null;
|
||||
$user_penilai_name = null;
|
||||
foreach ($user_penilai as $value) {
|
||||
if ($value->role == 'penilai') {
|
||||
$user_penilai_name = $value->user->name;
|
||||
$nik_penilai = $value->user->nik ?? '-';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return [
|
||||
$row->id,
|
||||
$row->nomor_registrasi,
|
||||
$row->user->name,
|
||||
$row->branch->name,
|
||||
$row->tujuanPenilaian->name,
|
||||
$row->debiture->name,
|
||||
$row->penilai->type_penilai ?? '-',
|
||||
$alamat_inspeksi ?? '-',
|
||||
$luasTanah,
|
||||
$luasBangunan,
|
||||
$nilaiTanah1,
|
||||
$nilaiBangunan1,
|
||||
$totalNilaiPasar,
|
||||
$likuidasi,
|
||||
$row->laporan->created_at ?? '-',
|
||||
$user_penilai_name,
|
||||
$nik_penilai,
|
||||
$row->created_at,
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
'ID',
|
||||
'Nomor Registrasi',
|
||||
'User Pemohon',
|
||||
'Cabang',
|
||||
'Tujuan Penilaian',
|
||||
'Debitur',
|
||||
'Jenis Laporan',
|
||||
'Lokasi Jaminan',
|
||||
'Luas Tanah',
|
||||
'Luas Bangunan',
|
||||
'Harga Tanah',
|
||||
'Harga Bangunan',
|
||||
'Nilai Pasar Wajar',
|
||||
'Likuidasi',
|
||||
'Tanggal Laporan',
|
||||
'Nama Penilai',
|
||||
'Nik Penilai',
|
||||
'Created At',
|
||||
];
|
||||
}
|
||||
public function columnFormats(): array
|
||||
{
|
||||
return [
|
||||
'A' => NumberFormat::FORMAT_NUMBER,
|
||||
'C' => NumberFormat::FORMAT_DATE_DATETIME,
|
||||
'K' => NumberFormat::FORMAT_DATE_DATETIME,
|
||||
'N' => NumberFormat::FORMAT_DATE_DATETIME
|
||||
];
|
||||
}
|
||||
}
|
||||
245
app/Exports/LaporanPenilaianJaminanExport.php
Normal file
245
app/Exports/LaporanPenilaianJaminanExport.php
Normal file
@@ -0,0 +1,245 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Exports;
|
||||
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use Maatwebsite\Excel\Concerns\WithTitle;
|
||||
use Maatwebsite\Excel\Concerns\WithCustomStartCell;
|
||||
use Maatwebsite\Excel\Concerns\WithEvents;
|
||||
use Maatwebsite\Excel\Events\AfterSheet;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\Branch;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Carbon\Carbon;
|
||||
|
||||
class LaporanPenilaianJaminanExport implements FromCollection, WithHeadings, WithMapping, WithTitle, WithCustomStartCell, WithEvents
|
||||
{
|
||||
protected $request;
|
||||
|
||||
public function __construct($request)
|
||||
{
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
public function collection()
|
||||
{
|
||||
$query = Permohonan::query();
|
||||
$query = $query->where('status', 'done');
|
||||
|
||||
// Apply date range filter if provided
|
||||
if ($this->request->has('start_date') || $this->request->has('end_date')) {
|
||||
$query->whereBetween('tanggal_permohonan', [
|
||||
$this->request->start_date ?? '1900-01-01',
|
||||
$this->request->end_date ?? now()->toDateString()
|
||||
]);
|
||||
}
|
||||
|
||||
// Apply branch filter if provided
|
||||
if ($this->request->has('branch_id') && !empty($this->request->branch_id)) {
|
||||
$query->where('branch_id', $this->request->branch_id);
|
||||
}
|
||||
|
||||
if ($this->request->has('penilai_id') && !empty($this->request->penilai_id)) {
|
||||
$request = $this->request; // Store in a local variable
|
||||
$query->whereHas('penilaian._user_penilai.userPenilaiTeam', function($q) use ($request) {
|
||||
$q->where('user_id', $request->penilai_id);
|
||||
});
|
||||
}
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($this->request->has('search') && !empty($this->request->search)) {
|
||||
$search = $this->request->search;
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Default ordering
|
||||
$query->orderBy('nomor_registrasi', 'asc');
|
||||
|
||||
return $query->with(['debiture.branch'])->get();
|
||||
}
|
||||
|
||||
protected $rowNumber = 0;
|
||||
|
||||
public function map($permohonan): array
|
||||
{
|
||||
$this->rowNumber++;
|
||||
$luas_tanah = 0;
|
||||
$luas_bangunan = 0;
|
||||
$nilai_tanah = 0;
|
||||
$nilai_bangunan = 0;
|
||||
$npw = 0;
|
||||
$nilai_liquidasi = 0;
|
||||
|
||||
if (isset($permohonan->penilai->lpj)) {
|
||||
$lpj = json_decode($permohonan->penilai->lpj, true);
|
||||
$npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0);
|
||||
|
||||
$luas_tanah = $lpj['luas_tanah'] ?? 0;
|
||||
$luas_bangunan = $lpj['luas_bangunan'] ?? 0;
|
||||
$nilai_tanah = str_replace('.', '', $lpj['nilai_tanah_2'] ?? 0);
|
||||
$nilai_bangunan = str_replace('.', '', $lpj['nilai_bangunan_2'] ?? 0);
|
||||
$nilai_liquidasi = str_replace('.', '', $lpj['likuidasi_nilai_2'] ?? 0);
|
||||
}
|
||||
|
||||
return [
|
||||
$this->rowNumber,
|
||||
$permohonan->nomor_registrasi,
|
||||
$permohonan->tanggal_permohonan,
|
||||
$permohonan->debiture->branch->name,
|
||||
$permohonan->debiture->name,
|
||||
$permohonan->creator->name,
|
||||
$permohonan->tujuanPenilaian->name,
|
||||
$permohonan->documents->pluck('jenisJaminan.name')->unique()->implode(', '),
|
||||
$permohonan->documents->map(function ($document) {
|
||||
return formatAlamat($document);
|
||||
})->unique()->implode(', '),
|
||||
$luas_tanah . ' m²',
|
||||
formatRupiah($nilai_tanah, 2),
|
||||
$luas_bangunan . ' m²',
|
||||
formatRupiah($nilai_bangunan, 2),
|
||||
($permohonan->approval_dd_at || $permohonan->approval_eo_at) ?
|
||||
formatTanggalIndonesia($permohonan->approval_dd_at ?? $permohonan->approval_eo_at) : '',
|
||||
$permohonan->penilaian->tanggal_kunjungan ?
|
||||
formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan) : '',
|
||||
formatRupiah($npw, 2),
|
||||
formatRupiah($nilai_liquidasi, 2),
|
||||
$permohonan->penilaian->_user_penilai->userPenilaiTeam->name,
|
||||
];
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
'No',
|
||||
'Nomor Registrasi',
|
||||
'Tanggal Permohonan',
|
||||
'Cabang',
|
||||
'Nama Debitur',
|
||||
'Pemohon',
|
||||
'Tujuan Penilaian',
|
||||
'Jenis Agunan',
|
||||
'Alamat Agunan',
|
||||
'Luas Tanah',
|
||||
'Nilai Tanah',
|
||||
'Luas Bangunan',
|
||||
'Nilai Bangunan',
|
||||
'Tanggal Laporan',
|
||||
'Tanggal Review',
|
||||
'Nilai Pasar Wajar',
|
||||
'Nilai Likuidasi',
|
||||
'Nama Penilai',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function title(): string
|
||||
{
|
||||
return 'Laporan Penilaian Jaminan';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function startCell(): string
|
||||
{
|
||||
return 'A7';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function registerEvents(): array
|
||||
{
|
||||
return [
|
||||
AfterSheet::class => function(AfterSheet $event) {
|
||||
// Get the sheet
|
||||
$sheet = $event->sheet->getDelegate();
|
||||
|
||||
// Set the title
|
||||
$sheet->setCellValue('A1', 'LAPORAN PENILAIAN JAMINAN');
|
||||
$sheet->getStyle('A1')->getFont()->setBold(true)->setSize(16);
|
||||
|
||||
// Merge cells for title
|
||||
$sheet->mergeCells('A1:R1');
|
||||
$sheet->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
|
||||
|
||||
// Set the branch information if filtered
|
||||
$branchInfo = '';
|
||||
if ($this->request->has('branch_id') && !empty($this->request->branch_id)) {
|
||||
$branch = Branch::find($this->request->branch_id);
|
||||
if ($branch) {
|
||||
$branchInfo = 'Cabang: ' . $branch->name;
|
||||
$sheet->setCellValue('A2', $branchInfo);
|
||||
$sheet->mergeCells('A2:R2');
|
||||
$sheet->getStyle('A2')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
|
||||
$sheet->getStyle('A2')->getFont()->setBold(true);
|
||||
}
|
||||
}
|
||||
|
||||
// Set the period
|
||||
$startDate = $this->request->start_date ?? '';
|
||||
$endDate = $this->request->end_date ?? '';
|
||||
|
||||
$rowIndex = $branchInfo ? 3 : 2;
|
||||
|
||||
if ($startDate && $endDate) {
|
||||
$startDateFormatted = Carbon::parse($startDate)->format('d F Y');
|
||||
$endDateFormatted = Carbon::parse($endDate)->format('d F Y');
|
||||
$sheet->setCellValue('A' . $rowIndex, 'Periode: ' . $startDateFormatted . ' - ' . $endDateFormatted);
|
||||
} else {
|
||||
$sheet->setCellValue('A' . $rowIndex, 'Periode: Semua Data');
|
||||
}
|
||||
$sheet->mergeCells('A' . $rowIndex . ':R' . $rowIndex);
|
||||
$sheet->getStyle('A' . $rowIndex)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
|
||||
|
||||
// Set the date of export
|
||||
$rowIndex++;
|
||||
$sheet->setCellValue('A' . $rowIndex, 'Tanggal Export: ' . Carbon::now()->format('d F Y H:i:s'));
|
||||
|
||||
// Set the user who exported
|
||||
$rowIndex++;
|
||||
$userName = Auth::user() ? Auth::user()->name : 'System';
|
||||
$sheet->setCellValue('A' . $rowIndex, 'Diexport oleh: ' . $userName);
|
||||
|
||||
// Add a blank line
|
||||
$rowIndex++;
|
||||
$sheet->setCellValue('A' . $rowIndex, '');
|
||||
|
||||
// Style the header row
|
||||
$headerRange = 'A7:' . $sheet->getHighestColumn() . '7';
|
||||
$sheet->getStyle($headerRange)->getFont()->setBold(true);
|
||||
$sheet->getStyle($headerRange)->getFill()
|
||||
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
|
||||
->getStartColor()->setARGB('FFCCCCCC');
|
||||
|
||||
// Auto-size columns
|
||||
foreach(range('A', $sheet->getHighestColumn()) as $column) {
|
||||
$sheet->getColumnDimension($column)->setAutoSize(true);
|
||||
}
|
||||
|
||||
// Add borders to all cells with data
|
||||
$dataRange = 'A7:' . $sheet->getHighestColumn() . $sheet->getHighestRow();
|
||||
$sheet->getStyle($dataRange)->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
|
||||
|
||||
// Center align the header row
|
||||
$sheet->getStyle($headerRange)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
|
||||
|
||||
// Set text wrap for header cells
|
||||
$sheet->getStyle($headerRange)->getAlignment()->setWrapText(true);
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
98
app/Exports/LaporanPermohonanExport.php
Normal file
98
app/Exports/LaporanPermohonanExport.php
Normal file
@@ -0,0 +1,98 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Exports;
|
||||
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class LaporanPermohonanExport implements FromCollection, WithHeadings, WithMapping
|
||||
{
|
||||
protected $request;
|
||||
|
||||
public function __construct($request)
|
||||
{
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
public function collection()
|
||||
{
|
||||
$query = Permohonan::query();
|
||||
|
||||
// Apply role-based filtering
|
||||
if (!Auth::user()->hasAnyRole(['administrator'])) {
|
||||
$query->where('branch_id', Auth::user()->branch_id);
|
||||
}
|
||||
|
||||
|
||||
// Apply date range filter if provided
|
||||
if ($this->request->has('start_date') || $this->request->has('end_date')) {
|
||||
$query->whereBetween('tanggal_permohonan', [
|
||||
$this->request->start_date ?? '1900-01-01',
|
||||
$this->request->end_date ?? now()->toDateString()
|
||||
]);
|
||||
}
|
||||
|
||||
// Apply status filter if provided
|
||||
if ($this->request->has('status') && !empty($this->request->status)) {
|
||||
$query->where('status', $this->request->status);
|
||||
}
|
||||
|
||||
// Apply branch filter if provided
|
||||
if ($this->request->has('branch_id') && !empty($this->request->branch_id)) {
|
||||
$query->where('branch_id', $this->request->branch_id);
|
||||
}
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($this->request->has('search') && !empty($this->request->search)) {
|
||||
$search = $this->request->search;
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Default ordering
|
||||
$query->orderBy('nomor_registrasi', 'asc');
|
||||
|
||||
return $query->get();
|
||||
}
|
||||
|
||||
public function map($permohonan): array
|
||||
{
|
||||
return [
|
||||
$permohonan->id,
|
||||
$permohonan->nomor_registrasi,
|
||||
$permohonan->tanggal_permohonan,
|
||||
$permohonan->user ? $permohonan->user->name : '',
|
||||
$permohonan->branch ? $permohonan->branch->name : '',
|
||||
$permohonan->tujuanPenilaian ? $permohonan->tujuanPenilaian->name : '',
|
||||
$permohonan->jenisFasilitasKredit ? $permohonan->jenisFasilitasKredit->name : '',
|
||||
$permohonan->jenisPenilaian ? $permohonan->jenisPenilaian->name : '',
|
||||
$permohonan->status,
|
||||
];
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
'ID',
|
||||
'Nomor Registrasi',
|
||||
'Tanggal Permohonan',
|
||||
'Pemohon',
|
||||
'Cabang',
|
||||
'Tujuan Penilaian',
|
||||
'Jenis Fasilitas Kredit',
|
||||
'Jenis Penilaian',
|
||||
'Status',
|
||||
];
|
||||
}
|
||||
}
|
||||
117
app/Exports/LaporanSlikExport.php
Normal file
117
app/Exports/LaporanSlikExport.php
Normal file
@@ -0,0 +1,117 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Exports;
|
||||
|
||||
use Maatwebsite\Excel\Concerns\FromQuery;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use Maatwebsite\Excel\Concerns\WithStyles;
|
||||
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
||||
|
||||
class LaporanSlikExport implements FromQuery, WithHeadings, WithMapping, WithStyles
|
||||
{
|
||||
protected $query;
|
||||
|
||||
public function __construct($query)
|
||||
{
|
||||
$this->query = $query;
|
||||
}
|
||||
|
||||
public function query()
|
||||
{
|
||||
return $this->query;
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
'Sandi Bank',
|
||||
'Kode Kantor',
|
||||
'Kode Cabang',
|
||||
'Tahun',
|
||||
'Bulan',
|
||||
'No Rekening',
|
||||
'CIF',
|
||||
'Nama Debitur',
|
||||
'NPWP',
|
||||
'No KTP',
|
||||
'No Telp',
|
||||
'Alamat',
|
||||
'Kode Pos',
|
||||
'Kode Kab/Kota',
|
||||
'Kode Negara Domisili',
|
||||
'Kode Jenis',
|
||||
'Kode Sifat',
|
||||
'Kode Valuta',
|
||||
'Baki Debet',
|
||||
'Kolektibilitas',
|
||||
'Tanggal Mulai',
|
||||
'Tanggal Jatuh Tempo',
|
||||
'Tanggal Selesai',
|
||||
'Tanggal Restrukturisasi',
|
||||
'Kode Sebab Macet',
|
||||
'Tanggal Macet',
|
||||
'Kode Kondisi',
|
||||
'Tanggal Kondisi',
|
||||
'Nilai Agunan',
|
||||
'Jenis Agunan',
|
||||
'Kode Agunan',
|
||||
'Peringkat Agunan',
|
||||
'Fasilitas',
|
||||
'Status Agunan',
|
||||
'Tanggal Lapor',
|
||||
'Status',
|
||||
'Tanggal Dibuat',
|
||||
];
|
||||
}
|
||||
|
||||
public function map($laporanSlik): array
|
||||
{
|
||||
return [
|
||||
$laporanSlik->sandi_bank,
|
||||
$laporanSlik->kode_kantor,
|
||||
$laporanSlik->kode_cabang,
|
||||
$laporanSlik->tahun,
|
||||
$laporanSlik->bulan,
|
||||
$laporanSlik->no_rekening,
|
||||
$laporanSlik->cif,
|
||||
$laporanSlik->nama_debitur,
|
||||
$laporanSlik->npwp,
|
||||
$laporanSlik->no_ktp,
|
||||
$laporanSlik->no_telp,
|
||||
$laporanSlik->alamat,
|
||||
$laporanSlik->kode_pos,
|
||||
$laporanSlik->kode_kab_kota,
|
||||
$laporanSlik->kode_negara_domisili,
|
||||
$laporanSlik->kode_jenis,
|
||||
$laporanSlik->kode_sifat,
|
||||
$laporanSlik->kode_valuta,
|
||||
$laporanSlik->baki_debet,
|
||||
$laporanSlik->kolektibilitas,
|
||||
$laporanSlik->tanggal_mulai,
|
||||
$laporanSlik->tanggal_jatuh_tempo,
|
||||
$laporanSlik->tanggal_selesai,
|
||||
$laporanSlik->tanggal_restrukturisasi,
|
||||
$laporanSlik->kode_sebab_macet,
|
||||
$laporanSlik->tanggal_macet,
|
||||
$laporanSlik->kode_kondisi,
|
||||
$laporanSlik->tanggal_kondisi,
|
||||
$laporanSlik->nilai_agunan,
|
||||
$laporanSlik->jenis_agunan,
|
||||
$laporanSlik->kode_agunan,
|
||||
$laporanSlik->peringkat_agunan,
|
||||
$laporanSlik->fasilitas,
|
||||
$laporanSlik->status_agunan,
|
||||
$laporanSlik->tanggal_lapor,
|
||||
$laporanSlik->status,
|
||||
$laporanSlik->created_at->format('d/m/Y H:i'),
|
||||
];
|
||||
}
|
||||
|
||||
public function styles(Worksheet $sheet)
|
||||
{
|
||||
return [
|
||||
1 => ['font' => ['bold' => true]],
|
||||
];
|
||||
}
|
||||
}
|
||||
232
app/Exports/LaporanUserLimitExport.php
Normal file
232
app/Exports/LaporanUserLimitExport.php
Normal file
@@ -0,0 +1,232 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Exports;
|
||||
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use Maatwebsite\Excel\Concerns\WithTitle;
|
||||
use Maatwebsite\Excel\Concerns\WithCustomStartCell;
|
||||
use Maatwebsite\Excel\Concerns\WithEvents;
|
||||
use Maatwebsite\Excel\Events\AfterSheet;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\Branch;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class LaporanUserLimitExport implements FromCollection, WithHeadings, WithMapping, WithTitle, WithCustomStartCell, WithEvents
|
||||
{
|
||||
protected $request;
|
||||
|
||||
public function __construct($request)
|
||||
{
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
public function collection()
|
||||
{
|
||||
$query = Permohonan::query();
|
||||
$query = $query->where('status', 'done');
|
||||
|
||||
// Apply date range filter if provided
|
||||
if ($this->request->has('start_date') || $this->request->has('end_date')) {
|
||||
$startDate = $this->request->start_date ?? '1900-01-01';
|
||||
$endDate = $this->request->end_date ?? now()->toDateString();
|
||||
|
||||
$query->where(function ($q) use ($startDate, $endDate) {
|
||||
|
||||
$q->whereHas('penilaian', function ($q2) use ($startDate, $endDate) {
|
||||
$q2->whereBetween('tanggal_kunjungan', [$startDate, $endDate]);
|
||||
});
|
||||
|
||||
// OR check if has penawaran with date in range
|
||||
$q->orWhereHas('penawaran', function ($q3) use ($startDate, $endDate) {
|
||||
$q3->whereBetween('tanggal_penilaian_sebelumnya', [$startDate, $endDate]);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Apply branch filter if provided
|
||||
if ($this->request->has('branch_id') && !empty($this->request->branch_id)) {
|
||||
$query->where('branch_id', $this->request->branch_id);
|
||||
}
|
||||
|
||||
if ($this->request->has('penilai_id') && !empty($this->request->penilai_id)) {
|
||||
$request = $this->request; // Store in a local variable
|
||||
$query->whereHas('penilaian._user_penilai.userPenilaiTeam', function ($q) use ($request) {
|
||||
$q->where('user_id', $request->penilai_id);
|
||||
});
|
||||
}
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($this->request->has('search') && !empty($this->request->search)) {
|
||||
$search = $this->request->search;
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('debiture', DB::raw('LOWER(name)'), 'LIKE', '%' . strtolower($search) . '%');
|
||||
|
||||
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Default ordering
|
||||
$query->orderBy('nomor_registrasi', 'asc');
|
||||
|
||||
return $query->get();
|
||||
}
|
||||
|
||||
protected $rowNumber = 0;
|
||||
|
||||
public function map($permohonan): array
|
||||
{
|
||||
$this->rowNumber++;
|
||||
$npw = 0;
|
||||
|
||||
if (isset($permohonan->penilai->lpj)) {
|
||||
$lpj = json_decode($permohonan->penilai->lpj, true);
|
||||
$npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0);
|
||||
}
|
||||
|
||||
return [
|
||||
$this->rowNumber,
|
||||
$permohonan->nomor_registrasi,
|
||||
$permohonan->debiture->branch->name ?? '',
|
||||
$permohonan->debiture->name ?? '',
|
||||
$permohonan->user->name ?? $permohonan->mig_nama_ao ?? '',
|
||||
$permohonan->tanggal_permohonan ?? '',
|
||||
$permohonan->penilaian->_user_penilai->userPenilaiTeam->name ?? '',
|
||||
$permohonan->penilaian && $permohonan->penilaian->tanggal_kunjungan
|
||||
? formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan)
|
||||
: '',
|
||||
formatRupiah($npw, 2),
|
||||
];
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
'No',
|
||||
'Nomor Registrasi',
|
||||
'Cabang',
|
||||
'Nama Debitur',
|
||||
'Pemohon',
|
||||
'Tanggal Permohonan',
|
||||
'Nama Penilai',
|
||||
'Tanggal Laporan',
|
||||
'Nilai Pasar Wajar',
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function title(): string
|
||||
{
|
||||
return 'Laporan User Limit';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function startCell(): string
|
||||
{
|
||||
return 'A7';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function registerEvents(): array
|
||||
{
|
||||
return [
|
||||
AfterSheet::class => function (AfterSheet $event) {
|
||||
// Get the sheet
|
||||
$sheet = $event->sheet->getDelegate();
|
||||
|
||||
// Set the title
|
||||
$sheet->setCellValue('A1', 'LAPORAN PENILAIAN JAMINAN');
|
||||
$sheet->getStyle('A1')->getFont()->setBold(true)->setSize(16);
|
||||
|
||||
// Merge cells for title
|
||||
$sheet->mergeCells('A1:AH1');
|
||||
$sheet->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
|
||||
|
||||
// Set the branch information if filtered
|
||||
$branchInfo = '';
|
||||
if ($this->request->has('branch_id') && !empty($this->request->branch_id)) {
|
||||
$branch = Branch::find($this->request->branch_id);
|
||||
if ($branch) {
|
||||
$branchInfo = 'Cabang: ' . $branch->name;
|
||||
$sheet->setCellValue('A2', $branchInfo);
|
||||
$sheet->mergeCells('A2:AH2');
|
||||
$sheet->getStyle('A2')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
|
||||
$sheet->getStyle('A2')->getFont()->setBold(true);
|
||||
}
|
||||
}
|
||||
|
||||
// Set the period
|
||||
$startDate = $this->request->start_date ?? '';
|
||||
$endDate = $this->request->end_date ?? '';
|
||||
|
||||
$rowIndex = $branchInfo ? 3 : 2;
|
||||
|
||||
if ($startDate && $endDate) {
|
||||
$startDateFormatted = Carbon::parse($startDate)->format('d F Y');
|
||||
$endDateFormatted = Carbon::parse($endDate)->format('d F Y');
|
||||
$sheet->setCellValue('A' . $rowIndex, 'Periode: ' . $startDateFormatted . ' - ' . $endDateFormatted);
|
||||
} else {
|
||||
$sheet->setCellValue('A' . $rowIndex, 'Periode: Semua Data');
|
||||
}
|
||||
$sheet->mergeCells('A' . $rowIndex . ':AH' . $rowIndex);
|
||||
$sheet->getStyle('A' . $rowIndex)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
|
||||
|
||||
// Set the date of export
|
||||
$rowIndex++;
|
||||
$sheet->setCellValue('A' . $rowIndex, 'Tanggal Export: ' . Carbon::now()->format('d F Y H:i:s'));
|
||||
|
||||
// Set the user who exported
|
||||
$rowIndex++;
|
||||
$userName = Auth::user() ? Auth::user()->name : 'System';
|
||||
$sheet->setCellValue('A' . $rowIndex, 'Diexport oleh: ' . $userName);
|
||||
|
||||
// Add a blank line
|
||||
$rowIndex++;
|
||||
$sheet->setCellValue('A' . $rowIndex, '');
|
||||
|
||||
// Style the header row
|
||||
$headerRange = 'A7:' . $sheet->getHighestColumn() . '7';
|
||||
$sheet->getStyle($headerRange)->getFont()->setBold(true);
|
||||
$sheet->getStyle($headerRange)->getFill()
|
||||
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
|
||||
->getStartColor()->setARGB('FFCCCCCC');
|
||||
|
||||
// Auto-size columns - fixed to handle columns beyond Z
|
||||
$highestColumn = $sheet->getHighestColumn();
|
||||
$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
|
||||
|
||||
for ($i = 1; $i <= $highestColumnIndex; $i++) {
|
||||
$currentColumn = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($i);
|
||||
$sheet->getColumnDimension($currentColumn)->setAutoSize(true);
|
||||
}
|
||||
|
||||
// Add borders to all cells with data
|
||||
$dataRange = 'A7:' . $sheet->getHighestColumn() . $sheet->getHighestRow();
|
||||
$sheet->getStyle($dataRange)->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
|
||||
|
||||
// Center align the header row
|
||||
$sheet->getStyle($headerRange)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
|
||||
|
||||
// Set text wrap for header cells
|
||||
$sheet->getStyle($headerRange)->getAlignment()->setWrapText(true);
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,7 @@
|
||||
$row->id,
|
||||
$row->code,
|
||||
$row->name,
|
||||
$row->biaya,
|
||||
$row->created_at
|
||||
];
|
||||
}
|
||||
@@ -35,6 +36,7 @@
|
||||
'ID',
|
||||
'Code',
|
||||
'Name',
|
||||
'Biaya',
|
||||
'Created At'
|
||||
];
|
||||
}
|
||||
@@ -44,7 +46,8 @@
|
||||
{
|
||||
return [
|
||||
'A' => NumberFormat::FORMAT_NUMBER,
|
||||
'D' => NumberFormat::FORMAT_DATE_DATETIME
|
||||
'D' => NumberFormat::FORMAT_NUMBER_00,
|
||||
'E' => NumberFormat::FORMAT_DATE_DATETIME
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
185
app/Exports/SlikExport.php
Normal file
185
app/Exports/SlikExport.php
Normal file
@@ -0,0 +1,185 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Exports;
|
||||
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use Modules\Lpj\Models\Slik;
|
||||
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
|
||||
|
||||
/**
|
||||
* Export class untuk data SLIK (Sistem Layanan Informasi Keuangan)
|
||||
*
|
||||
* Class ini menangani export data SLIK ke format Excel dengan:
|
||||
* - Mapping data sesuai struktur SLIK
|
||||
* - Format kolom yang sesuai (text, number, date)
|
||||
* - Header yang informatif
|
||||
*/
|
||||
class SlikExport implements WithColumnFormatting, WithHeadings, FromCollection, WithMapping
|
||||
{
|
||||
/**
|
||||
* Mengambil collection data SLIK untuk di-export
|
||||
*
|
||||
* @return \Illuminate\Support\Collection
|
||||
*/
|
||||
public function collection()
|
||||
{
|
||||
return Slik::orderBy('created_at', 'desc')->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Mapping data SLIK untuk setiap baris dalam Excel
|
||||
*
|
||||
* @param \Modules\Lpj\Models\Slik $row
|
||||
* @return array
|
||||
*/
|
||||
public function map($row): array
|
||||
{
|
||||
return [
|
||||
$row->id, // A - ID
|
||||
$row->sandi_bank, // B - Sandi Bank
|
||||
$row->tahun, // C - Tahun
|
||||
$row->bulan, // D - Bulan
|
||||
$row->flag_detail, // E - Flag Detail
|
||||
$row->kode_register_agunan, // F - Kode Register Agunan
|
||||
$row->no_rekening, // G - No Rekening
|
||||
$row->cif, // H - CIF
|
||||
$row->kolektibilitas, // I - Kolektibilitas
|
||||
$row->fasilitas, // J - Fasilitas
|
||||
$row->jenis_segmen_fasilitas, // K - Jenis Segmen Fasilitas
|
||||
$row->status_agunan, // L - Status Agunan
|
||||
$row->jenis_agunan, // M - Jenis Agunan
|
||||
$row->peringkat_agunan, // N - Peringkat Agunan
|
||||
$row->lembaga_pemeringkat, // O - Lembaga Pemeringkat
|
||||
$row->jenis_pengikatan, // P - Jenis Pengikatan
|
||||
$row->tanggal_pengikatan, // Q - Tanggal Pengikatan
|
||||
$row->nama_pemilik_agunan, // R - Nama Pemilik Agunan
|
||||
$row->bukti_kepemilikan, // S - Bukti Kepemilikan
|
||||
$row->alamat_agunan, // T - Alamat Agunan
|
||||
$row->lokasi_agunan, // U - Lokasi Agunan
|
||||
$row->nilai_agunan, // V - Nilai Agunan
|
||||
$row->nilai_agunan_menurut_ljk, // W - Nilai Agunan Menurut LJK
|
||||
$row->tanggal_penilaian_ljk, // X - Tanggal Penilaian LJK
|
||||
$row->nilai_agunan_penilai_independen, // Y - Nilai Agunan Penilai Independen
|
||||
$row->nama_penilai_independen, // Z - Nama Penilai Independen
|
||||
$row->tanggal_penilaian_penilai_independen, // AA - Tanggal Penilaian Penilai Independen
|
||||
$row->jumlah_hari_tunggakan, // AB - Jumlah Hari Tunggakan
|
||||
$row->status_paripasu, // AC - Status Paripasu
|
||||
$row->prosentase_paripasu, // AD - Prosentase Paripasu
|
||||
$row->status_kredit_join, // AE - Status Kredit Join
|
||||
$row->diasuransikan, // AF - Diasuransikan
|
||||
$row->keterangan, // AG - Keterangan
|
||||
$row->kantor_cabang, // AH - Kantor Cabang
|
||||
$row->operasi_data, // AI - Operasi Data
|
||||
$row->kode_cabang, // AJ - Kode Cabang
|
||||
$row->nama_debitur, // AK - Nama Debitur
|
||||
$row->nama_cabang, // AL - Nama Cabang
|
||||
$row->flag, // AM - Flag
|
||||
$row->created_at, // AN - Created At
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Header kolom untuk Excel
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
'ID',
|
||||
'Sandi Bank',
|
||||
'Tahun',
|
||||
'Bulan',
|
||||
'Flag Detail',
|
||||
'Kode Register Agunan',
|
||||
'No Rekening',
|
||||
'CIF',
|
||||
'Kolektibilitas',
|
||||
'Fasilitas',
|
||||
'Jenis Segmen Fasilitas',
|
||||
'Status Agunan',
|
||||
'Jenis Agunan',
|
||||
'Peringkat Agunan',
|
||||
'Lembaga Pemeringkat',
|
||||
'Jenis Pengikatan',
|
||||
'Tanggal Pengikatan',
|
||||
'Nama Pemilik Agunan',
|
||||
'Bukti Kepemilikan',
|
||||
'Alamat Agunan',
|
||||
'Lokasi Agunan',
|
||||
'Nilai Agunan',
|
||||
'Nilai Agunan Menurut LJK',
|
||||
'Tanggal Penilaian LJK',
|
||||
'Nilai Agunan Penilai Independen',
|
||||
'Nama Penilai Independen',
|
||||
'Tanggal Penilaian Penilai Independen',
|
||||
'Jumlah Hari Tunggakan',
|
||||
'Status Paripasu',
|
||||
'Prosentase Paripasu',
|
||||
'Status Kredit Join',
|
||||
'Diasuransikan',
|
||||
'Keterangan',
|
||||
'Kantor Cabang',
|
||||
'Operasi Data',
|
||||
'Kode Cabang',
|
||||
'Nama Debitur',
|
||||
'Nama Cabang',
|
||||
'Flag',
|
||||
'Created At',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Format kolom untuk Excel
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function columnFormats(): array
|
||||
{
|
||||
return [
|
||||
'A' => NumberFormat::FORMAT_NUMBER, // ID
|
||||
'B' => NumberFormat::FORMAT_TEXT, // Sandi Bank
|
||||
'C' => NumberFormat::FORMAT_TEXT, // Tahun
|
||||
'D' => NumberFormat::FORMAT_TEXT, // Bulan
|
||||
'E' => NumberFormat::FORMAT_TEXT, // Flag Detail
|
||||
'F' => NumberFormat::FORMAT_TEXT, // Kode Register Agunan
|
||||
'G' => NumberFormat::FORMAT_TEXT, // No Rekening
|
||||
'H' => NumberFormat::FORMAT_TEXT, // CIF
|
||||
'I' => NumberFormat::FORMAT_TEXT, // Kolektibilitas
|
||||
'J' => NumberFormat::FORMAT_TEXT, // Fasilitas
|
||||
'K' => NumberFormat::FORMAT_TEXT, // Jenis Segmen Fasilitas
|
||||
'L' => NumberFormat::FORMAT_TEXT, // Status Agunan
|
||||
'M' => NumberFormat::FORMAT_TEXT, // Jenis Agunan
|
||||
'N' => NumberFormat::FORMAT_TEXT, // Peringkat Agunan
|
||||
'O' => NumberFormat::FORMAT_TEXT, // Lembaga Pemeringkat
|
||||
'P' => NumberFormat::FORMAT_TEXT, // Jenis Pengikatan
|
||||
'Q' => NumberFormat::FORMAT_DATE_DDMMYYYY, // Tanggal Pengikatan
|
||||
'R' => NumberFormat::FORMAT_TEXT, // Nama Pemilik Agunan
|
||||
'S' => NumberFormat::FORMAT_TEXT, // Bukti Kepemilikan
|
||||
'T' => NumberFormat::FORMAT_TEXT, // Alamat Agunan
|
||||
'U' => NumberFormat::FORMAT_TEXT, // Lokasi Agunan
|
||||
'V' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Nilai Agunan
|
||||
'W' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Nilai Agunan Menurut LJK
|
||||
'X' => NumberFormat::FORMAT_DATE_DDMMYYYY, // Tanggal Penilaian LJK
|
||||
'Y' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Nilai Agunan Penilai Independen
|
||||
'Z' => NumberFormat::FORMAT_TEXT, // Nama Penilai Independen
|
||||
'AA' => NumberFormat::FORMAT_DATE_DDMMYYYY, // Tanggal Penilaian Penilai Independen
|
||||
'AB' => NumberFormat::FORMAT_NUMBER, // Jumlah Hari Tunggakan
|
||||
'AC' => NumberFormat::FORMAT_TEXT, // Status Paripasu
|
||||
'AD' => NumberFormat::FORMAT_PERCENTAGE_00, // Prosentase Paripasu
|
||||
'AE' => NumberFormat::FORMAT_TEXT, // Status Kredit Join
|
||||
'AF' => NumberFormat::FORMAT_TEXT, // Diasuransikan
|
||||
'AG' => NumberFormat::FORMAT_TEXT, // Keterangan
|
||||
'AH' => NumberFormat::FORMAT_TEXT, // Kantor Cabang
|
||||
'AI' => NumberFormat::FORMAT_TEXT, // Operasi Data
|
||||
'AJ' => NumberFormat::FORMAT_TEXT, // Kode Cabang
|
||||
'AK' => NumberFormat::FORMAT_TEXT, // Nama Debitur
|
||||
'AL' => NumberFormat::FORMAT_TEXT, // Nama Cabang
|
||||
'AM' => NumberFormat::FORMAT_TEXT, // Flag
|
||||
'AN' => NumberFormat::FORMAT_DATE_DATETIME, // Created At
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,110 +1,777 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Modules\Lpj\Models\PenawaranDetailTender;
|
||||
use Modules\Lpj\Models\PenawaranTender;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
function formatTanggalIndonesia($date)
|
||||
{
|
||||
$carbonDate = Carbon::parse($date);
|
||||
$indonesianMonths = [
|
||||
'Januari',
|
||||
'Februari',
|
||||
'Maret',
|
||||
'April',
|
||||
'Mei',
|
||||
'Juni',
|
||||
'Juli',
|
||||
'Agustus',
|
||||
'September',
|
||||
'Oktober',
|
||||
'November',
|
||||
'Desember',
|
||||
];
|
||||
$month = $indonesianMonths[$carbonDate->month - 1];
|
||||
return $carbonDate->format('d') . ' ' . $month . ' ' . $carbonDate->format('Y');
|
||||
}
|
||||
use Carbon\Carbon;
|
||||
use Modules\Location\Models\City;
|
||||
use Modules\Location\Models\District;
|
||||
use Modules\Location\Models\Province;
|
||||
use Modules\Location\Models\Village;
|
||||
use Modules\Lpj\Models\CustomField;
|
||||
use Modules\Lpj\Models\HolidayCalendar;
|
||||
use Modules\Lpj\Models\JenisDokumen;
|
||||
use Modules\Lpj\Models\Laporan;
|
||||
use Modules\Lpj\Models\PenawaranDetailTender;
|
||||
use Modules\Lpj\Models\PenawaranTender;
|
||||
use Modules\Lpj\Models\Penilaian;
|
||||
use Modules\Lpj\Models\TeamsUsers;
|
||||
use Modules\Usermanagement\Models\User;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
/**
|
||||
* Format tanggal ke dalam format Bahasa Indonesia
|
||||
*
|
||||
* Mengubah tanggal menjadi format yang lebih mudah dibaca dalam Bahasa Indonesia.
|
||||
* Contoh: "15 Januari 2024" atau "15 Januari 2024 pukul 14.30 WIB"
|
||||
*
|
||||
* @param string|mixed $date Tanggal yang akan diformat (string tanggal atau null)
|
||||
* @param bool $time Apakah akan menampilkan waktu juga (default: false)
|
||||
* @return string Tanggal yang sudah diformat dalam Bahasa Indonesia
|
||||
*
|
||||
* @example
|
||||
* formatTanggalIndonesia('2024-01-15') // "15 Januari 2024"
|
||||
* formatTanggalIndonesia('2024-01-15 14:30:00', true) // "15 Januari 2024 pukul 14.30 WIB"
|
||||
* formatTanggalIndonesia(null) // ""
|
||||
* formatTanggalIndonesia('invalid-date') // "invalid-date" (return as-is jika error)
|
||||
*/
|
||||
function formatTanggalIndonesia($date, $time = false): string
|
||||
{
|
||||
Log::debug('Memulai format tanggal Indonesia', [
|
||||
'date' => $date,
|
||||
'time' => $time
|
||||
]);
|
||||
|
||||
function formatRupiah($number)
|
||||
{
|
||||
$number = (float) $number;
|
||||
return 'Rp ' . number_format($number, 2, ',', '.');
|
||||
}
|
||||
// Validasi input null atau kosong
|
||||
if (empty($date)) {
|
||||
Log::debug('Tanggal kosong, return empty string');
|
||||
return '';
|
||||
}
|
||||
|
||||
Carbon::setLocale('id');
|
||||
|
||||
function formatAlamat($alamat)
|
||||
{
|
||||
return ($alamat->address ? $alamat->address . ', ' : '') .
|
||||
(isset($alamat->village) ? $alamat->village->name . ', ' : '') .
|
||||
(isset($alamat->city) ? $alamat->city->name . ', ' : '') .
|
||||
(isset($alamat->province) ? $alamat->province->name . ', ' : '') .
|
||||
($alamat->postal_code ?? '');
|
||||
}
|
||||
try {
|
||||
$waktu = Carbon::parse($date);
|
||||
|
||||
// andy add
|
||||
function checkActiveDateRangePenawaran($id)
|
||||
{
|
||||
$penawaran = PenawaranTender::find($id);
|
||||
if (!$time) {
|
||||
$result = $waktu->translatedFormat('d F Y');
|
||||
Log::debug('Format tanggal berhasil', ['result' => $result]);
|
||||
return $result;
|
||||
}
|
||||
|
||||
$start_date = strtotime($penawaran->start_date);
|
||||
$end_date = strtotime($penawaran->end_date);
|
||||
$todays_date = strtotime(now());
|
||||
$result = $waktu->translatedFormat('d F Y') . ' pukul ' . $waktu->format('H.i') . ' WIB';
|
||||
Log::debug('Format tanggal dengan waktu berhasil', ['result' => $result]);
|
||||
return $result;
|
||||
|
||||
$allow = true;
|
||||
if ($todays_date >= $start_date && $todays_date <= $end_date) {
|
||||
//Penawaran dibuka
|
||||
$allow = true;
|
||||
} else {
|
||||
if ($todays_date < $start_date) {
|
||||
//Penawaran Belum dibuka
|
||||
$allow = true;
|
||||
} else {
|
||||
//Penawaran sudah ditutup
|
||||
$allow = false;
|
||||
} catch (Throwable $e) {
|
||||
Log::warning('Gagal parse tanggal', [
|
||||
'date' => $date,
|
||||
'error' => $e->getMessage()
|
||||
]);
|
||||
// Return input as-is jika gagal parse
|
||||
return (string) $date;
|
||||
}
|
||||
}
|
||||
|
||||
return $allow;
|
||||
}
|
||||
/**
|
||||
* Format angka ke dalam format mata uang Rupiah Indonesia
|
||||
*
|
||||
* Mengubah angka menjadi format mata uang Rupiah dengan pemisah ribuan
|
||||
* dan menggunakan koma sebagai pemisah desimal sesuai standar Indonesia.
|
||||
*
|
||||
* @param int|float|string $number Angka yang akan diformat (bisa negatif)
|
||||
* @param int $decimals Jumlah digit desimal (default: 0)
|
||||
* @return string Angka yang sudah diformat dalam format Rupiah
|
||||
*
|
||||
* @example
|
||||
* formatRupiah(1500000) // "Rp 1.500.000"
|
||||
* formatRupiah(1500000.50, 2) // "Rp 1.500.000,50"
|
||||
* formatRupiah(-500000) // "Rp -500.000"
|
||||
* formatRupiah(0) // "Rp 0"
|
||||
* formatRupiah(null) // "Rp 0"
|
||||
*/
|
||||
function formatRupiah($number, $decimals = 0, $withSymbol = true): string
|
||||
{
|
||||
Log::debug('Memulai format Rupiah', [
|
||||
'number' => $number,
|
||||
'decimals' => $decimals,
|
||||
'withSymbol' => $withSymbol
|
||||
]);
|
||||
|
||||
function checkKelengkapanDetailKJPP($id)
|
||||
{
|
||||
$allow = true;
|
||||
// DB::enableQueryLog();
|
||||
// detail_penawaran apakah isian biaya_penawaran, attachment, dokumen_persetujuan sudah lengkap?
|
||||
$query = PenawaranDetailTender::select('id')
|
||||
->where('penawaran_id', '=', $id)
|
||||
->where(function ($query) {
|
||||
$query->orWhere('biaya_penawaran', '', "");
|
||||
$query->orWhereNull('biaya_penawaran');
|
||||
// Handle null atau kosong
|
||||
if ($number === null || $number === '') {
|
||||
Log::debug('Number null atau kosong, return Rp 0');
|
||||
return $withSymbol ? 'Rp 0' : '0';
|
||||
}
|
||||
|
||||
$query->orWhere('attachment', '', "");
|
||||
$query->orWhereNull('attachment');
|
||||
// Remove dots if present
|
||||
$number = str_replace('.', '', (string) $number);
|
||||
|
||||
$query->orWhere('dokumen_persetujuan', '', "");
|
||||
$query->orWhereNull('dokumen_persetujuan');
|
||||
})->get();
|
||||
// $sql = DB::getQueryLog();
|
||||
// Konversi ke float dan handle error
|
||||
try {
|
||||
$number = (float) $number;
|
||||
} catch (Throwable $e) {
|
||||
Log::warning('Gagal konversi number ke float', [
|
||||
'number' => $number,
|
||||
'error' => $e->getMessage()
|
||||
]);
|
||||
return $withSymbol ? 'Rp 0' : '0';
|
||||
}
|
||||
|
||||
// Validasi decimals
|
||||
$decimals = max(0, (int) $decimals);
|
||||
|
||||
if (sizeof($query) > 0) {
|
||||
$allow = false;
|
||||
$formatted = number_format($number, $decimals, ',', '.');
|
||||
$result = $withSymbol ? 'Rp ' . $formatted : $formatted;
|
||||
Log::debug('Format Rupiah berhasil', ['result' => $result]);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
return $allow;
|
||||
}
|
||||
|
||||
// convert
|
||||
function convertSlug($slug) {
|
||||
|
||||
$words = explode('-', $slug);
|
||||
|
||||
foreach ($words as $index => $word) {
|
||||
$words[$index] = strtoupper($word);
|
||||
function formatAlamat($alamat)
|
||||
{
|
||||
return ($alamat->address ? $alamat->address . ', ' : '') . (isset($alamat->village) ? $alamat->village->name . ', ' : '') . (isset($alamat->city) ? $alamat->city->name . ', ' : '') . (isset($alamat->province) ? $alamat->province->name . ', ' : '') . ($alamat->village->postal_code ?? '');
|
||||
}
|
||||
|
||||
return implode(' ', $words);
|
||||
}
|
||||
// andy add
|
||||
// andy add
|
||||
function checkActiveDateRangePenawaran($id)
|
||||
{
|
||||
$penawaran = PenawaranTender::find($id);
|
||||
|
||||
$start_date = strtotime($penawaran->start_date);
|
||||
$end_date = strtotime($penawaran->end_date);
|
||||
$todays_date = strtotime(now());
|
||||
//$todays_date = strtotime("+1 day", strtotime(now()));
|
||||
|
||||
$allow = true;
|
||||
if ($todays_date >= $start_date && $todays_date <= $end_date) {
|
||||
//Penawaran dibuka
|
||||
$allow = true;
|
||||
} else {
|
||||
if ($todays_date < $start_date) {
|
||||
//Penawaran Belum dibuka
|
||||
$allow = true;
|
||||
} else {
|
||||
//Penawaran sudah ditutup
|
||||
$allow = false;
|
||||
}
|
||||
}
|
||||
|
||||
return $allow;
|
||||
}
|
||||
|
||||
function checkKelengkapanDetailKJPP($id)
|
||||
{
|
||||
$allow = true;
|
||||
// DB::enableQueryLog();
|
||||
// detail_penawaran apakah isian biaya_penawaran, attachment, dokumen_persetujuan sudah lengkap?
|
||||
$query = PenawaranDetailTender::select('id')->where('penawaran_id', '=', $id)->where('status', '=', 1)->where(
|
||||
function ($query) {
|
||||
// no_proposal
|
||||
$query->orWhere('no_proposal', '', "");
|
||||
$query->orWhereNull('no_proposal');
|
||||
|
||||
// tgl_proposal
|
||||
$query->orWhere('tgl_proposal', '', "");
|
||||
$query->orWhereNull('tgl_proposal');
|
||||
|
||||
$query->orWhere('biaya_penawaran', '', "");
|
||||
$query->orWhereNull('biaya_penawaran');
|
||||
|
||||
$query->orWhere('attachment', '', "");
|
||||
$query->orWhereNull('attachment');
|
||||
|
||||
$query->orWhere('dokumen_persetujuan', '', "");
|
||||
$query->orWhereNull('dokumen_persetujuan');
|
||||
},
|
||||
)->get();
|
||||
|
||||
if (sizeof($query) > 0) {
|
||||
$allow = false;
|
||||
}
|
||||
|
||||
return $allow;
|
||||
}
|
||||
|
||||
// convert
|
||||
function convertSlug($slug)
|
||||
{
|
||||
$words = explode('-', $slug);
|
||||
|
||||
foreach ($words as $index => $word) {
|
||||
$words[$index] = strtoupper($word);
|
||||
}
|
||||
|
||||
return implode(' ', $words);
|
||||
}
|
||||
|
||||
// generate last penawaran.code
|
||||
function onLastnumberCodePenawaran()
|
||||
: string
|
||||
{
|
||||
// ambil code terakhir
|
||||
$maxCode = PenawaranTender::max('code');
|
||||
// chek data penawaran terakhir --> mengurutkan data berdasarkan kolom `created_at` secara DESC
|
||||
// $penawaran = PenawaranTender::latest()->first();
|
||||
$penawaran = PenawaranTender::where('code', '=', $maxCode)->first();
|
||||
$code_penawaran_last = '';
|
||||
|
||||
// nomor di set 0001
|
||||
$noUrutAkhirString = sprintf("%04s", 1);
|
||||
if ($penawaran) {
|
||||
$isNum = substr($maxCode, 2); // memastikan string ke 3 s/d 8 adalan numiric
|
||||
$isNP = substr($maxCode, 0, 2);
|
||||
if ((8 == strlen($maxCode)) && ("NP" == $isNP) && (ctype_digit($isNum))) {
|
||||
$code_penawaran_last = substr($maxCode, -4);
|
||||
$year_penawaran_last = Carbon::parse($penawaran->created_at)->year;
|
||||
$year_now = Carbon::now()->year;
|
||||
if ($year_now == $year_penawaran_last) {
|
||||
$noUrutAkhirString = sprintf("%04s", abs($code_penawaran_last + 1));
|
||||
}
|
||||
// jika ternyata tahun tdk sama (kurang dari tahun sekarang), maka nomor di set 0001
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return 'NP' . Carbon::now()->format('y') . $noUrutAkhirString;
|
||||
}
|
||||
|
||||
// generate last penawaran.no_spk
|
||||
function onLastnumberCodePenawaranSPK($jenis_laporan_code)
|
||||
: string
|
||||
{
|
||||
|
||||
// 20241124_001 ==> spk_no_core
|
||||
// XXX / PJ / JKT / MONTH-ROM / FR|SR / 2024
|
||||
// 001 / PJ / JKT / XI / FR / 2024
|
||||
$maxCode = PenawaranTender::max('spk_no_core');
|
||||
$penawaran = PenawaranTender::where('spk_no_core', '=', $maxCode)->first();
|
||||
$no_spk_penawaran_last = '';
|
||||
$year_penawaran_last = '';
|
||||
$year_now = Carbon::now()->year;
|
||||
// nomor di set 001
|
||||
$noUrutAkhirString = sprintf("%03s", 1);
|
||||
if ($penawaran) {
|
||||
$no_spk_penawaran_last = substr($maxCode, -3);
|
||||
$year_penawaran_last = substr($maxCode, 0, 4);
|
||||
|
||||
if ($year_now == $year_penawaran_last) {
|
||||
$noUrutAkhirString = sprintf("%03s", abs($no_spk_penawaran_last + 1));
|
||||
}
|
||||
// jika ternyata tahun tdk sama (kurang dari tahun sekarang), maka nomor di set 001
|
||||
}
|
||||
|
||||
$month = onRomawi(Carbon::now()->month);
|
||||
|
||||
$lastSPK = $noUrutAkhirString . ' / PJ / JKT / ' . $month . ' / ' . $jenis_laporan_code . ' / ' . $year_now;
|
||||
return $lastSPK;
|
||||
}
|
||||
|
||||
function onRomawi(int $bln)
|
||||
: string
|
||||
{
|
||||
return convertToRoman($bln);
|
||||
}
|
||||
|
||||
function penyebut($nilai)
|
||||
{
|
||||
$nilai = abs($nilai);
|
||||
$huruf = [
|
||||
"",
|
||||
"satu",
|
||||
"dua",
|
||||
"tiga",
|
||||
"empat",
|
||||
"lima",
|
||||
"enam",
|
||||
"tujuh",
|
||||
"delapan",
|
||||
"sembilan",
|
||||
"sepuluh",
|
||||
"sebelas"
|
||||
];
|
||||
$temp = "";
|
||||
if ($nilai < 12) {
|
||||
$temp = " " . $huruf[$nilai];
|
||||
} else if ($nilai < 20) {
|
||||
$temp = penyebut($nilai - 10) . " belas";
|
||||
} else if ($nilai < 100) {
|
||||
$temp = penyebut($nilai / 10) . " puluh" . penyebut($nilai % 10);
|
||||
} else if ($nilai < 200) {
|
||||
$temp = " seratus" . penyebut($nilai - 100);
|
||||
} else if ($nilai < 1000) {
|
||||
$temp = penyebut($nilai / 100) . " ratus" . penyebut($nilai % 100);
|
||||
} else if ($nilai < 2000) {
|
||||
$temp = " seribu" . penyebut($nilai - 1000);
|
||||
} else if ($nilai < 1000000) {
|
||||
$temp = penyebut($nilai / 1000) . " ribu" . penyebut($nilai % 1000);
|
||||
} else if ($nilai < 1000000000) {
|
||||
$temp = penyebut($nilai / 1000000) . " juta" . penyebut($nilai % 1000000);
|
||||
} else if ($nilai < 1000000000000) {
|
||||
$temp = penyebut($nilai / 1000000000) . " milyar" . penyebut(fmod($nilai, 1000000000));
|
||||
} else if ($nilai < 1000000000000000) {
|
||||
$temp = penyebut($nilai / 1000000000000) . " trilyun" . penyebut(fmod($nilai, 1000000000000));
|
||||
}
|
||||
return $temp;
|
||||
}
|
||||
|
||||
function terbilang($nilai)
|
||||
{
|
||||
if ($nilai < 0) {
|
||||
$hasil = "minus " . trim(penyebut($nilai));
|
||||
} else {
|
||||
$hasil = trim(penyebut($nilai));
|
||||
}
|
||||
return $hasil;
|
||||
}
|
||||
|
||||
function hitungHariKerja($tanggalMulai, $tanggalSelesai)
|
||||
{
|
||||
$tanggalMulai = Carbon::parse($tanggalMulai)->startOfDay();
|
||||
$tanggalSelesai = Carbon::parse($tanggalSelesai)->endOfDay();
|
||||
|
||||
$hariKerja = 0;
|
||||
$tanggalSekarang = $tanggalMulai->copy();
|
||||
|
||||
while ($tanggalSekarang <= $tanggalSelesai) {
|
||||
// Cek apakah hari ini bukan Sabtu atau Minggu dan bukan hari libur
|
||||
if (!$tanggalSekarang->isWeekend() && !in_array($tanggalSekarang->format('Y-m-d'), holidays())) {
|
||||
$hariKerja++;
|
||||
}
|
||||
$tanggalSekarang->addDay();
|
||||
}
|
||||
|
||||
return $hariKerja;
|
||||
}
|
||||
|
||||
function countPermohonanForUser($userId)
|
||||
{
|
||||
$validStatuses = [
|
||||
'assign',
|
||||
'survey-completed',
|
||||
'proses-laporan',
|
||||
'paparan',
|
||||
'proses-paparan',
|
||||
'revisi-laporan',
|
||||
'revisi-paparan',
|
||||
'survey',
|
||||
'proses-survey',
|
||||
'request-reschedule',
|
||||
'reschedule',
|
||||
'rejected-reschedule',
|
||||
'approved-reschedule',
|
||||
'revisi-survey',
|
||||
'revisi-pembayaran'
|
||||
];
|
||||
|
||||
$result = Penilaian::whereHas('userPenilai', function ($query) use ($userId) {
|
||||
$query->where('user_id', $userId);
|
||||
})
|
||||
->whereHas('permohonan', function ($query) use ($validStatuses) {
|
||||
$query->whereIn('status', $validStatuses);
|
||||
})
|
||||
->get()
|
||||
->groupBy(function ($item) {
|
||||
// Pastikan mengakses properti dari model yang valid
|
||||
return $item->userPenilai->first()->user_id . '-' . $item->permohonan->id;
|
||||
})
|
||||
->map(function ($group) {
|
||||
return [
|
||||
'statuses' => $group->pluck('permohonan.status')->unique()->values()->all(),
|
||||
];
|
||||
});
|
||||
|
||||
return $result->count();
|
||||
}
|
||||
|
||||
|
||||
function getMaxFileSize($jenis)
|
||||
{
|
||||
$jenisDokumen = JenisDokumen::where('name', $jenis)->first();
|
||||
if (!$jenisDokumen) {
|
||||
return 2048;
|
||||
}
|
||||
//konversi ke KB (1 MB = 1024 KB)
|
||||
$maxSizeInKB = (int) $jenisDokumen->max_size * 1024;
|
||||
|
||||
return $maxSizeInKB;
|
||||
}
|
||||
|
||||
function getUser($userId)
|
||||
{
|
||||
return User::find($userId);
|
||||
}
|
||||
|
||||
function generateLpjUniqueCode($randomLength = 6)
|
||||
{
|
||||
|
||||
$year = date('y');
|
||||
$month = str_pad(date('m'), 2, '0', STR_PAD_LEFT);
|
||||
$day = str_pad(date('d'), 2, '0', STR_PAD_LEFT);
|
||||
|
||||
// Generate random numbers
|
||||
//$randomNumber = str_pad(mt_rand(0, pow(10, $randomLength) - 1), $randomLength, '0', STR_PAD_LEFT);
|
||||
$randomNumber = sprintf('%0' . $randomLength . 'd', mt_rand(0, pow(10, $randomLength) - 1));
|
||||
|
||||
// Concatenate components to create the custom code
|
||||
return $year . $month . $day . $randomNumber;
|
||||
}
|
||||
|
||||
function checkRegionUserName($userId)
|
||||
{
|
||||
$region = TeamsUsers::where('user_id', $userId)->first();
|
||||
if ($region) {
|
||||
return $region->team->regions->name;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function getNomorLaporan($permohonanId, $documentId, $type = 'nomor_laporan')
|
||||
{
|
||||
|
||||
$laporan = Laporan::where([
|
||||
'permohonan_id' => $permohonanId,
|
||||
'dokumen_jaminan_id' => $documentId,
|
||||
])->first();
|
||||
|
||||
if (!$laporan) {
|
||||
return $type == 'nomor_laporan' ? '-' : null;
|
||||
}
|
||||
|
||||
return $type == 'nomor_laporan' ? $laporan->nomor_laporan : $laporan->created_at;
|
||||
}
|
||||
|
||||
function getCustomField($param)
|
||||
{
|
||||
if (is_numeric($param)) {
|
||||
$field = CustomField::find($param);
|
||||
} else {
|
||||
$field = CustomField::where(['name' => $param])->first();
|
||||
}
|
||||
if ($field) {
|
||||
return $field;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function getWilayahName($code, $type)
|
||||
{
|
||||
try {
|
||||
$wilayah = null;
|
||||
|
||||
if (!$code) {
|
||||
return null;
|
||||
}
|
||||
|
||||
switch ($type) {
|
||||
case 'province':
|
||||
$wilayah = Province::where('code', $code)->first();
|
||||
return $wilayah ? $wilayah->name : null;
|
||||
|
||||
case 'city':
|
||||
$wilayah = City::where('code', $code)->first();
|
||||
return $wilayah ? $wilayah->name : null;
|
||||
|
||||
case 'district':
|
||||
$wilayah = District::where('code', $code)->first();
|
||||
return $wilayah ? $wilayah->name : null;
|
||||
|
||||
case 'village':
|
||||
$wilayah = Village::where('code', $code)->first();
|
||||
return $wilayah ? $wilayah->name : null;
|
||||
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function formatLabel($key)
|
||||
{
|
||||
|
||||
static $labelCache = [];
|
||||
if (isset($labelCache[$key])) {
|
||||
return $labelCache[$key];
|
||||
}
|
||||
|
||||
$customLabel = CustomField::where('name', $key)->first();
|
||||
$labelCache[$key] = $customLabel->label ?? ucwords(str_replace('_', ' ', $key));
|
||||
|
||||
return $labelCache[$key];
|
||||
}
|
||||
|
||||
function calculateSLA($permohonan, $type)
|
||||
{
|
||||
if (!$type) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$nilai_plafond = in_array($permohonan->nilai_plafond_id, [2, 3]);
|
||||
$nilai_plafond_2 = in_array($permohonan->nilai_plafond_id, [1]);
|
||||
|
||||
$slaMap = [
|
||||
'resume' => $nilai_plafond ? 2 : null,
|
||||
'paparan' => $nilai_plafond ? 2 : null,
|
||||
'standard' => $nilai_plafond ? 3 : null,
|
||||
'sederhana' => $nilai_plafond ? 2 : null,
|
||||
'paparan' => $nilai_plafond_2 ? 3 : null,
|
||||
'rap' => 3,
|
||||
'memo' => $nilai_plafond ? 1 : null
|
||||
];
|
||||
|
||||
if ($type === 'paparan' && isset($permohonan->tujuanPenilaian->name) && $permohonan->tujuanPenilaian->name === 'rap') {
|
||||
return 2;
|
||||
}
|
||||
|
||||
return $slaMap[$type] ?? null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Menghitung total nilai berdasarkan key dan jenis legalitas.
|
||||
*
|
||||
* @param array $detailsArray
|
||||
* @param string $key
|
||||
* @param int $jenisLegalitas
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function calculateTotalLuas($detailsArray, $key, $jenisLegalitas, $defaultJenisLegalitas, $fallbackJenisLegalitas)
|
||||
{
|
||||
$total = 0;
|
||||
|
||||
if ($detailsArray) {
|
||||
foreach ($detailsArray as $item) {
|
||||
if (isset($item->jenis_legalitas_jaminan_id) && $item->jenis_legalitas_jaminan_id === $jenisLegalitas) {
|
||||
$details = json_decode($item->details, true);
|
||||
|
||||
if (is_array($details)) {
|
||||
foreach ($details as $detail) {
|
||||
if (isset($detail[$key])) {
|
||||
$total += (int) $detail[$key];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Jika total masih 0, gunakan jenis jaminan ppjb
|
||||
if ($total === 0) {
|
||||
foreach ($detailsArray as $item) {
|
||||
if (isset($item->jenis_legalitas_jaminan_id) && $item->jenis_legalitas_jaminan_id === $defaultJenisLegalitas) {
|
||||
$details = json_decode($item->details, true);
|
||||
|
||||
if (is_array($details)) {
|
||||
foreach ($details as $detail) {
|
||||
if (isset($detail[$key]) && $detail[$key] !== null) {
|
||||
$total += (int) $detail[$key];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// jika total masih kosong juga maka gunakan ppb
|
||||
if ($total === 0 && $fallbackJenisLegalitas !== null) {
|
||||
foreach ($detailsArray as $item) {
|
||||
if (isset($item->jenis_legalitas_jaminan_id) && $item->jenis_legalitas_jaminan_id === $fallbackJenisLegalitas) {
|
||||
$details = json_decode($item->details, true);
|
||||
|
||||
if (is_array($details)) {
|
||||
foreach ($details as $detail) {
|
||||
if (isset($detail[$key]) && $detail[$key] !== null) {
|
||||
$total += (int) $detail[$key];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $total > 0 ? $total : 0;
|
||||
}
|
||||
|
||||
|
||||
function ubahNomorHp($nomorHp)
|
||||
{
|
||||
|
||||
$nomorHp = preg_replace('/\D/', '', $nomorHp);
|
||||
if (strpos($nomorHp, '62') === 0) {
|
||||
$nomorBaru = substr($nomorHp, 0, 5) . "xxxxx";
|
||||
return '+' . $nomorBaru;
|
||||
} else if (strpos($nomorHp, '0') === 0) {
|
||||
|
||||
$nomorBaru = substr($nomorHp, 0, 5) . "xxxxxx";
|
||||
return $nomorBaru;
|
||||
} else {
|
||||
return "Nomor HP tidak valid";
|
||||
}
|
||||
}
|
||||
|
||||
function parsePembandingMigration($keterangan) {
|
||||
$keterangan = preg_replace('/[-]{5,}/', '',$keterangan); // Hapus ------
|
||||
$keterangan = preg_replace('/[.]{5,}/', '',$keterangan); // Hapus .....
|
||||
|
||||
$keterangan = preg_replace('/\s+/', ' ',$keterangan);
|
||||
$keterangan = preg_replace('/\s*\n\s*/', "\n",$keterangan);
|
||||
|
||||
// Pecah teks per baris untuk diproses
|
||||
$lines = explode("\n",$keterangan);
|
||||
$cleaned = [];
|
||||
|
||||
foreach ($lines as $line) {
|
||||
$line = trim($line);
|
||||
if (!empty($line)) {
|
||||
// Format angka dalam format Rp. 123.456.789
|
||||
$line = preg_replace_callback('/Rp\.\s*([\d.,]+)/', function($matches) {
|
||||
$angka = str_replace(['.', ','], '', $matches[1]);
|
||||
return 'Rp. ' . number_format((int)$angka, 0, ',', '.');
|
||||
}, $line);
|
||||
|
||||
// Jika ada tanda pagar (#), pisahkan menjadi baris baru
|
||||
$line = str_replace('#', "\n#", $line);
|
||||
|
||||
$cleaned[] = $line;
|
||||
}
|
||||
}
|
||||
|
||||
return implode("\n", $cleaned);
|
||||
}
|
||||
|
||||
/**
|
||||
* get full path to internal storage file or external storage file
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
|
||||
function getFilePath($path)
|
||||
{
|
||||
// define base path external storage (use .env) example: 'F:\path\to\storage' in windows
|
||||
$externalBase = env('EXTERNAL_STORAGE_BASE_PATH', 'F:LPJ/lpj/LPJ Gambar/001/');
|
||||
|
||||
$segments = explode('/', $path);
|
||||
|
||||
if(strtoupper($segments[0]) === 'SURVEYOR'){
|
||||
$year = $segments[1];
|
||||
$month = ucfirst(strtolower($segments[2]));
|
||||
$date = $segments[3];
|
||||
$code = $segments[4];
|
||||
$file = $segments[5] ?? '';
|
||||
|
||||
$extenalFullpath = $externalBase . $year . '/' . $month . '/' . $date . '/' . $code . '/' . $file;
|
||||
|
||||
if(File::exists($extenalFullpath)){
|
||||
return $extenalFullpath;
|
||||
}
|
||||
}
|
||||
|
||||
// if not found in external storage, try to find in internal storage
|
||||
if (Storage::exists($path)) {
|
||||
return Storage::url('app/' . $path);
|
||||
}
|
||||
return $path;
|
||||
}
|
||||
|
||||
|
||||
function parseTimestamp(?string $timestamp): ?string
|
||||
{
|
||||
if (!$timestamp) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Trim whitespace dan normalize
|
||||
$timestamp = trim($timestamp);
|
||||
|
||||
// Log untuk debugging
|
||||
Log::info('Mencoba parsing timestamp: "' . $timestamp . '"');
|
||||
|
||||
// Parsing dengan DateTime native PHP untuk lebih robust
|
||||
try {
|
||||
// Pattern untuk format d/m/Y H:i:s
|
||||
if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{4})\s+(\d{1,2}):(\d{1,2}):(\d{1,2})$/', $timestamp, $matches)) {
|
||||
$day = (int) $matches[1];
|
||||
$month = (int) $matches[2];
|
||||
$year = (int) $matches[3];
|
||||
$hour = (int) $matches[4];
|
||||
$minute = (int) $matches[5];
|
||||
$second = (int) $matches[6];
|
||||
|
||||
// Validasi nilai
|
||||
if ($day >= 1 && $day <= 31 && $month >= 1 && $month <= 12 && $year >= 1900 && $year <= 2100 &&
|
||||
$hour >= 0 && $hour <= 23 && $minute >= 0 && $minute <= 59 && $second >= 0 && $second <= 59) {
|
||||
|
||||
// Buat DateTime object langsung
|
||||
$dateTime = new \DateTime();
|
||||
$dateTime->setDate($year, $month, $day);
|
||||
$dateTime->setTime($hour, $minute, $second);
|
||||
|
||||
$result = $dateTime->format('Y-m-d H:i:s');
|
||||
Log::info('Berhasil parsing dengan DateTime: ' . $timestamp . ' -> ' . $result);
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
// Pattern untuk format d/m/Y tanpa waktu
|
||||
if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/', $timestamp, $matches)) {
|
||||
$day = (int) $matches[1];
|
||||
$month = (int) $matches[2];
|
||||
$year = (int) $matches[3];
|
||||
|
||||
// Validasi nilai
|
||||
if ($day >= 1 && $day <= 31 && $month >= 1 && $month <= 12 && $year >= 1900 && $year <= 2100) {
|
||||
|
||||
// Buat DateTime object langsung
|
||||
$dateTime = new \DateTime();
|
||||
$dateTime->setDate($year, $month, $day);
|
||||
$dateTime->setTime(0, 0, 0);
|
||||
|
||||
$result = $dateTime->format('Y-m-d H:i:s');
|
||||
Log::info('Berhasil parsing tanpa waktu dengan DateTime: ' . $timestamp . ' -> ' . $result);
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Gagal parsing dengan DateTime: ' . $timestamp . '. Error: ' . $e->getMessage());
|
||||
}
|
||||
|
||||
// Fallback ke format Carbon standar untuk format lainnya
|
||||
$formats = [
|
||||
'Y-m-d H:i:s',
|
||||
'Y-m-d',
|
||||
'd-m-Y H:i:s',
|
||||
'd-m-Y',
|
||||
'j-n-Y H:i:s',
|
||||
'j-n-Y',
|
||||
];
|
||||
|
||||
foreach ($formats as $format) {
|
||||
try {
|
||||
$carbon = \Carbon\Carbon::createFromFormat($format, $timestamp);
|
||||
|
||||
if ($carbon && $carbon->format($format) === $timestamp) {
|
||||
// Jika format tidak mengandung waktu, set ke awal hari
|
||||
if (!str_contains($format, 'H:i:s')) {
|
||||
$carbon = $carbon->startOfDay();
|
||||
}
|
||||
Log::info('Berhasil parsing dengan format ' . $format . ': ' . $timestamp . ' -> ' . $carbon->toDateTimeString());
|
||||
return $carbon->toDateTimeString();
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
// Lanjut ke format berikutnya
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
Log::error('Tidak dapat memparsing timestamp dengan format apapun: "' . $timestamp . '"');
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -4,14 +4,18 @@ namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Exception;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\Penilaian;
|
||||
use Modules\Lpj\Models\TeamsUsers;
|
||||
use Modules\Lpj\Models\PenilaianTeam;
|
||||
use Modules\Lpj\Models\StatusPermohonan;
|
||||
use Modules\Lpj\Exports\PermohonanExport;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Models\Teams;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class ActivityController extends Controller
|
||||
{
|
||||
@@ -32,43 +36,204 @@ class ActivityController extends Controller
|
||||
|
||||
public function progres_activity()
|
||||
{
|
||||
// Ambil user yang sedang login
|
||||
$user = auth()->user();
|
||||
$roles = $user->load('roles');
|
||||
// Ambil user yang sedang login dengan roles
|
||||
$user = auth()->user()->load('roles');
|
||||
|
||||
// Inisialisasi regionId dan teamId sebagai null agar bisa dinamis
|
||||
$regionId = null;
|
||||
$teamId = null;
|
||||
// Inisialisasi regionId dan teamId
|
||||
$regionId = $teamId = null;
|
||||
|
||||
if ($roles->roles->pluck('name')->contains('senior-officer')) {
|
||||
$userTeam = TeamsUsers::with('team')
|
||||
->where('user_id', $user->id)
|
||||
->first();
|
||||
if ($user->roles->pluck('name')->contains('senior-officer')) {
|
||||
$userTeam = TeamsUsers::with('team')->firstWhere('user_id', $user->id);
|
||||
$regionId = $userTeam?->team->regions_id;
|
||||
$teamId = $userTeam?->teams_id;
|
||||
|
||||
}
|
||||
|
||||
|
||||
$teamsActivity = TeamsUsers::with(['user', 'team', 'team.regions', 'user.roles'])
|
||||
->whereHas('team', function ($q) use ($regionId, $teamId) {
|
||||
if ($regionId) {
|
||||
$q->where('regions_id', $regionId);
|
||||
}
|
||||
if ($teamId) {
|
||||
$q->where('id', $teamId); // Hanya tim yang sama
|
||||
}
|
||||
$q->when($regionId, fn ($q) => $q->where('regions_id', $regionId))
|
||||
->when($teamId, fn ($q) => $q->where('id', $teamId));
|
||||
})
|
||||
->where('user_id', '!=', $user->id)
|
||||
->whereHas('user.roles', function ($query) {
|
||||
// Filter hanya peran 'surveyor' atau 'surveyor-penilai'
|
||||
$query->whereIn('name', ['surveyor', 'surveyor-penilai']);
|
||||
})
|
||||
->whereHas('user.roles', fn ($q) => $q->whereIn('name', ['surveyor', 'surveyor-penilai','penilai']))
|
||||
->get();
|
||||
|
||||
return view('lpj::activity.progres_activity.index', compact('teamsActivity'));
|
||||
$teamId = is_array($teamId) ? $teamId : [$teamId];
|
||||
|
||||
$teamPenilai = Teams::with(['regions', 'teamsUsers', 'teamsUsers.user'])->whereNotIn(
|
||||
'id',
|
||||
$teamId
|
||||
)->get();
|
||||
|
||||
|
||||
return view('lpj::activity.progres_activity.index', compact('teamsActivity', 'teamPenilai'));
|
||||
}
|
||||
|
||||
|
||||
public function updateTeamAssingment(Request $request)
|
||||
{
|
||||
try {
|
||||
|
||||
// dd($request->all());
|
||||
$validatedData = $request->validate([
|
||||
'id' => 'required|integer', // penilaian_id
|
||||
'team_member_id' => 'nullable|integer',
|
||||
'region_id' => 'nullable|integer',
|
||||
'permohonan_id' => 'required|integer',
|
||||
'user_id' => 'required|integer',
|
||||
'team_id' => 'required|integer',
|
||||
'penugasan' => 'required|string',
|
||||
], [
|
||||
'team_member_id.required_without' => 'Field team harus diisi.',
|
||||
'.required_without' => 'Field harus diisi.',
|
||||
]);
|
||||
|
||||
|
||||
$penilaianId = $validatedData['id'];
|
||||
$teamMemberId = $validatedData['team_member_id'] ?? null;
|
||||
$regionId = $validatedData['region_id'] ?? null;
|
||||
$permohonanId = $validatedData['permohonan_id'];
|
||||
$userId = $validatedData['user_id'];
|
||||
$teamId = $validatedData['team_id'];
|
||||
$penugasan = $validatedData['penugasan'];
|
||||
|
||||
// Cek apakah permohonan ada
|
||||
$permohonan = Permohonan::findOrFail($permohonanId);
|
||||
|
||||
// Validasi status permohonan
|
||||
// if ($permohonan->status !== 'assign' && $permohonan->status !== 'proses-survey' && $permohonan->status !== 'survey' && $permohonan->status !== 'proses-laporan') {
|
||||
// return response()->json([
|
||||
// 'status' => 'error',
|
||||
// 'message' => 'Tidak dapat mengganti tim, status permohonan tidak memungkinkan.',
|
||||
// ]);
|
||||
// }
|
||||
|
||||
// Ambil tim berdasarkan penilaian_id dan user_id
|
||||
|
||||
if ($penugasan === 'sama') {
|
||||
$teams = PenilaianTeam::where('penilaian_id', $penilaianId)
|
||||
->where('user_id', $userId)
|
||||
->get();
|
||||
// Cek apakah tim ditemukan
|
||||
if ($teams->isEmpty()) {
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'Data tim tidak ditemukan.',
|
||||
]);
|
||||
}
|
||||
|
||||
// Mulai transaksi
|
||||
DB::beginTransaction();
|
||||
$updated = false;
|
||||
|
||||
$status_permohonan = $permohonan->status;
|
||||
|
||||
// Proses update berdasarkan region_id
|
||||
if ($regionId) {
|
||||
foreach ($teams as $team) {
|
||||
if ($team->role === 'surveyor') {
|
||||
$team->update([
|
||||
'team_id' => $regionId,
|
||||
'user_id' => null,
|
||||
'status' => $status_permohonan,
|
||||
]);
|
||||
$permohonan->update([
|
||||
'status' => 'reassign'
|
||||
]);
|
||||
$updated = true;
|
||||
}
|
||||
|
||||
if ($team->role === 'penilai') {
|
||||
$team->update([
|
||||
'team_id' => $regionId,
|
||||
'user_id' => null,
|
||||
'status' => $status_permohonan
|
||||
]);
|
||||
$permohonan->update([
|
||||
'status' => 'reassign',
|
||||
'region_id' => $regionId,
|
||||
]);
|
||||
$updated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Proses update berdasarkan team_member_id
|
||||
if ($teamMemberId) {
|
||||
foreach ($teams as $team) {
|
||||
if ($team->role === 'surveyor' || $team->role === 'penilai') {
|
||||
$team->update(['user_id' => $teamMemberId]);
|
||||
$updated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($penugasan === 'surveyor' || $penugasan === 'penilai') {
|
||||
$teams = PenilaianTeam::where('penilaian_id', $penilaianId)
|
||||
->where('user_id', $userId)
|
||||
->where('role', $penugasan)
|
||||
->first();
|
||||
|
||||
// Cek apakah tim ditemukan
|
||||
if (!$teams) {
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'Data tim tidak ditemukan.',
|
||||
]);
|
||||
}
|
||||
|
||||
// Mulai transaksi
|
||||
DB::beginTransaction();
|
||||
$updated = false;
|
||||
|
||||
// Proses update berdasarkan region_id
|
||||
if ($regionId) {
|
||||
$teams->update([
|
||||
'team_id' => $regionId,
|
||||
'user_id' => null
|
||||
]);
|
||||
$permohonan->update([
|
||||
'status' => $status_permohonan,
|
||||
'region_id' => $regionId,
|
||||
]);
|
||||
$updated = true;
|
||||
}
|
||||
|
||||
// Proses update berdasarkan team_member_id
|
||||
if ($teamMemberId) {
|
||||
$teams->update(['user_id' => $teamMemberId]);
|
||||
$updated = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ($updated) {
|
||||
DB::commit();
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'message' => 'Data tim berhasil diperbarui.',
|
||||
]);
|
||||
}
|
||||
|
||||
DB::rollBack();
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'Tidak ada perubahan yang dilakukan.',
|
||||
]);
|
||||
} catch (\Throwable $th) {
|
||||
// Rollback transaksi jika terjadi error
|
||||
DB::rollBack();
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'Terjadi kesalahan: ' . $th->getMessage(),
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public function senior()
|
||||
{
|
||||
@@ -128,10 +293,20 @@ class ActivityController extends Controller
|
||||
// abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
$userRole = $user->roles->pluck('name')->first();
|
||||
$regionId = null;
|
||||
|
||||
// If user is senior-officer, get their regionId
|
||||
if ($userRole === 'senior-officer') {
|
||||
$userTeam = TeamsUsers::with('team')->firstWhere('user_id', $user->id);
|
||||
$regionId = $userTeam?->team->regions_id;
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = Permohonan::query();
|
||||
|
||||
// Apply search filter if provided
|
||||
$query = $query->orderBy('nomor_registrasi', 'desc');
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
@@ -150,7 +325,9 @@ class ActivityController extends Controller
|
||||
});
|
||||
}
|
||||
|
||||
// Default sorting if no sort provided
|
||||
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
@@ -173,22 +350,39 @@ class ActivityController extends Controller
|
||||
// Get filtered count
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get data
|
||||
|
||||
$data = null;
|
||||
$userRole = $user->roles[0]->name ?? null;
|
||||
|
||||
if (in_array($userRole, ['surveyor', 'surveyor-penilai'])) {
|
||||
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian',])
|
||||
->whereHas('penilaian.userPenilai', function ($q) use ($user) {
|
||||
$q->where('user_id', $user->id);
|
||||
})
|
||||
->get();
|
||||
} else {
|
||||
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])
|
||||
->get();
|
||||
// Filter by region if user is senior-officer
|
||||
if ($regionId) {
|
||||
$query->whereHas('region', function ($q) use ($regionId) {
|
||||
$q->where('region_id', $regionId);
|
||||
});
|
||||
}
|
||||
|
||||
// Filter for specific roles
|
||||
if (in_array($userRole, ['surveyor', 'penilai'])) {
|
||||
$query->whereHas('penilaian.userPenilai', function ($q) use ($user) {
|
||||
$q->where('user_id', $user->id);
|
||||
});
|
||||
}
|
||||
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Pagination
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = (int) $request->get('page', 1);
|
||||
$size = (int) $request->get('size', 10);
|
||||
$offset = ($page - 1) * $size;
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get filtered count
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get data with necessary relationships
|
||||
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan','nilaiPlafond'])->get();
|
||||
|
||||
// Calculate total pages
|
||||
$pageCount = ceil($totalRecords / $request->get('size', 10));
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -237,10 +431,36 @@ class ActivityController extends Controller
|
||||
'permohonan.debiture',
|
||||
'permohonan.tujuanPenilaian',
|
||||
'permohonan.debiture.documents.jenisJaminan',
|
||||
'userPenilai'
|
||||
'userPenilai' => function ($query) use ($id) {
|
||||
$query->where('user_id', $id);
|
||||
},
|
||||
'permohonan.penilai',
|
||||
'permohonan.approveEo',
|
||||
'permohonan.approveDd',
|
||||
'permohonan.approveSo',
|
||||
|
||||
])
|
||||
->whereHas('userPenilai', function ($q) use ($id) {
|
||||
$q->where('user_id', $id);
|
||||
})
|
||||
->whereHas('permohonan', function ($q) {
|
||||
$q->whereIn('status', [
|
||||
'assign',
|
||||
'survey-completed',
|
||||
'proses-laporan',
|
||||
'paparan',
|
||||
'proses-paparan',
|
||||
'revisi-laporan',
|
||||
'revisi-paparan',
|
||||
'survey',
|
||||
'proses-survey',
|
||||
'request-reschedule',
|
||||
'reschedule',
|
||||
'rejected-reschedule',
|
||||
'approved-reschedule',
|
||||
'revisi-survey',
|
||||
'revisi-pembayaran'
|
||||
]);
|
||||
});
|
||||
|
||||
|
||||
@@ -271,6 +491,104 @@ class ActivityController extends Controller
|
||||
|
||||
// Ambil data dengan pagination
|
||||
$data = $query->skip($offset)->take($size)->get();
|
||||
|
||||
$data = $data->map(function ($item) {
|
||||
$jeniAsset = null;
|
||||
$statusPembayaran = trim(strtolower($item->permohonan->status_bayar ?? ''));
|
||||
$tujuanPenilaian = $item->permohonan->tujuanPenilaian->name ?? null;
|
||||
$plafond = $item->permohonan->nilaiPlafond->name ?? null;
|
||||
|
||||
$now = Carbon::now();
|
||||
$type_report = $item->permohonan->penilai->type ?? "";
|
||||
|
||||
$hari = $hariPaparan = 0;
|
||||
|
||||
if ($type_report == "sederhana") {
|
||||
$hari = 2;
|
||||
$item->paparan = 'Tidak Ada';
|
||||
} else {
|
||||
if ($plafond == '< 2M') {
|
||||
$item->paparan = 'Tidak Ada';
|
||||
$hari = 3;
|
||||
} elseif ($plafond == '2 M - 5 M') {
|
||||
$hari = 3;
|
||||
$hariPaparan = 2;
|
||||
} else {
|
||||
$hari = 5;
|
||||
$hariPaparan = 3;
|
||||
}
|
||||
}
|
||||
|
||||
if ($tujuanPenilaian == 'RAP') {
|
||||
$hari = 2;
|
||||
$hariPaparan = 2;
|
||||
}
|
||||
|
||||
|
||||
if ($item->permohonan && $item->permohonan->debiture) {
|
||||
$jeniAsset = $item->permohonan->debiture->documents->first() ?? null;
|
||||
}
|
||||
|
||||
/*$hariTambahan = 0;
|
||||
|
||||
if ($tujuanPenilaian == 'RAP') {
|
||||
$hariTambahan = 2;
|
||||
} else {
|
||||
if ($statusPembayaran == 'sudah_bayar') {
|
||||
$hariTambahan = 1; // H+1 untuk yang sudah bayar
|
||||
} else {
|
||||
$hariTambahan = 2; // H+2 untuk yang belum bayar
|
||||
}
|
||||
}*/
|
||||
|
||||
$tanggalMulai = $item->waktu_penilaian;
|
||||
|
||||
if ($tanggalMulai) {
|
||||
if (!$tanggalMulai instanceof Carbon) {
|
||||
$tanggalMulai = Carbon::parse($tanggalMulai);
|
||||
}
|
||||
$hariKerjaBerikutnya = hitungHariKerja($tanggalMulai->toDateString(), $tanggalMulai->copy()->addDays(1));
|
||||
$hariKerjaBerikutnya = max($hariKerjaBerikutnya, 1);
|
||||
$tanggalMulai = $tanggalMulai->copy()->addDays($hariKerjaBerikutnya);
|
||||
|
||||
// Konversi string tanggal ke objek Carbon jika belum
|
||||
if (!$tanggalMulai instanceof Carbon) {
|
||||
$tanggalMulai = Carbon::parse($tanggalMulai);
|
||||
}
|
||||
|
||||
// Hitung tanggal selesai berdasarkan hari tambahan
|
||||
$tanggalSelesai = $tanggalMulai->copy()->addDays($hari);
|
||||
$tanggalPaparan = $tanggalMulai->copy()->addDays($hariPaparan);
|
||||
|
||||
// Hitung hari kerja
|
||||
$hariKerja = hitungHariKerja($tanggalMulai->toDateString(), $tanggalSelesai->toDateString());
|
||||
$hariKerja = max($hariKerja, $hari);
|
||||
|
||||
$hariKerjaPaparan = hitungHariKerja($tanggalMulai->toDateString(), $tanggalPaparan->toDateString());
|
||||
$hariKerjaPaparan = max($hariKerjaPaparan, $hariPaparan);
|
||||
|
||||
// Set due date SLA
|
||||
$dueDateSla = $tanggalMulai->copy()->addDays($hariKerja);
|
||||
$dueDateSlaPaparan = $tanggalMulai->copy()->addDays($hariKerjaPaparan);
|
||||
|
||||
// Cek apakah sudah melewati due date
|
||||
/*if ($now->greaterThan($dueDateSla)) {
|
||||
$item->due_date_sla = null;
|
||||
} else {
|
||||
$item->due_date_sla = $dueDateSla->toDateString();
|
||||
}*/
|
||||
|
||||
$item->due_date_sla = $dueDateSla->toDateString();
|
||||
$item->paparan = $dueDateSlaPaparan->toDateString();
|
||||
} else {
|
||||
$item->due_date_sla = null;
|
||||
$item->paparan = null;
|
||||
|
||||
}
|
||||
|
||||
return $item;
|
||||
});
|
||||
|
||||
$filteredRecords = $data->count();
|
||||
$pageCount = ceil($totalRecords / $size);
|
||||
|
||||
|
||||
183
app/Http/Controllers/Api/DebiturController.php
Normal file
183
app/Http/Controllers/Api/DebiturController.php
Normal file
@@ -0,0 +1,183 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Exception;
|
||||
use Modules\Lpj\Models\Debiture;
|
||||
|
||||
/**
|
||||
* Controller untuk API pencarian debitur
|
||||
* Digunakan untuk autocomplete search pada form pembayaran
|
||||
*/
|
||||
class DebiturController extends Controller
|
||||
{
|
||||
/**
|
||||
* Pencarian debitur untuk autocomplete
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function search(Request $request): JsonResponse
|
||||
{
|
||||
try {
|
||||
// Log aktivitas pencarian
|
||||
Log::info('API Debitur Search - Request', [
|
||||
'query' => $request->get('q'),
|
||||
'user_id' => Auth::id()
|
||||
]);
|
||||
|
||||
$query = $request->get('q', '');
|
||||
|
||||
// Validasi minimal 2 karakter untuk pencarian
|
||||
if (strlen($query) < 2) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Minimal 2 karakter untuk pencarian',
|
||||
'data' => []
|
||||
], 400);
|
||||
}
|
||||
|
||||
// Mulai database transaction
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
// Query pencarian debitur
|
||||
// Asumsi tabel debitur dengan kolom: id, code, nama, alamat
|
||||
$debiturs = Debiture::query()
|
||||
->select('id', 'cif', 'name', 'address')
|
||||
->whereAny(['cif','name'], 'LIKE', "%{$query}%")
|
||||
->orderBy('name', 'asc')
|
||||
->limit(20) // Batasi hasil maksimal 20
|
||||
->get();
|
||||
|
||||
// Format data untuk TomSelect
|
||||
$formattedData = $debiturs->map(function($debitur) {
|
||||
return [
|
||||
'id' => $debitur->id,
|
||||
'kode_debitur' => $debitur->cif,
|
||||
'name' => $debitur->name,
|
||||
'address' => $debitur->address
|
||||
];
|
||||
});
|
||||
|
||||
DB::commit();
|
||||
|
||||
// Log hasil pencarian
|
||||
Log::info('API Debitur Search - Success', [
|
||||
'query' => $query,
|
||||
'results_count' => $formattedData->count(),
|
||||
'user_id' => Auth::id()
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Data debitur berhasil ditemukan',
|
||||
'data' => $formattedData
|
||||
]);
|
||||
|
||||
} catch (Exception $e) {
|
||||
DB::rollback();
|
||||
throw $e;
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
// Log error
|
||||
Log::error('API Debitur Search - Error', [
|
||||
'query' => $request->get('q'),
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString(),
|
||||
'user_id' => Auth::id()
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Terjadi kesalahan saat mencari data debitur',
|
||||
'error' => config('app.debug') ? $e->getMessage() : 'Internal Server Error'
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get detail debitur berdasarkan code
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function getByCode(Request $request): JsonResponse
|
||||
{
|
||||
try {
|
||||
$code = $request->get('code');
|
||||
|
||||
if (empty($code)) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Code debitur harus diisi',
|
||||
'data' => null
|
||||
], 400);
|
||||
}
|
||||
|
||||
// Log aktivitas get detail
|
||||
Log::info('API Debitur GetByCode - Request', [
|
||||
'code' => $code,
|
||||
'user_id' => Auth::id()
|
||||
]);
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
$debitur = DB::table('debitur')
|
||||
->select('id', 'code', 'nama', 'alamat', 'telepon', 'email')
|
||||
->where('code', $code)
|
||||
->where('status', 'aktif')
|
||||
->first();
|
||||
|
||||
if (!$debitur) {
|
||||
DB::rollback();
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Debitur tidak ditemukan',
|
||||
'data' => null
|
||||
], 404);
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
|
||||
Log::info('API Debitur GetByCode - Success', [
|
||||
'code' => $code,
|
||||
'debitur_id' => $debitur->id,
|
||||
'user_id' => Auth::id()
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Data debitur berhasil ditemukan',
|
||||
'data' => $debitur
|
||||
]);
|
||||
|
||||
} catch (Exception $e) {
|
||||
DB::rollback();
|
||||
throw $e;
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
Log::error('API Debitur GetByCode - Error', [
|
||||
'code' => $request->get('code'),
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString(),
|
||||
'user_id' => Auth::id()
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Terjadi kesalahan saat mengambil data debitur',
|
||||
'error' => config('app.debug') ? $e->getMessage() : 'Internal Server Error'
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
311
app/Http/Controllers/BankDataController.php
Normal file
311
app/Http/Controllers/BankDataController.php
Normal file
@@ -0,0 +1,311 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Routing\Controller;
|
||||
use Log;
|
||||
use Modules\Location\Models\Province;
|
||||
use Modules\Lpj\Http\Requests\BankDataRequest;
|
||||
use Modules\Lpj\Models\BankData;
|
||||
use Modules\Lpj\Models\Inspeksi;
|
||||
use Modules\Lpj\Models\JenisJaminan;
|
||||
use Modules\Lpj\Services\BankDataService;
|
||||
|
||||
class BankDataController extends Controller
|
||||
{
|
||||
protected $bankDataService;
|
||||
protected $user;
|
||||
|
||||
public function __construct(BankDataService $bankDataService)
|
||||
{
|
||||
$this->bankDataService = $bankDataService;
|
||||
}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
$provinces = Province::all();
|
||||
$jenisJaminan = JenisJaminan::all();
|
||||
|
||||
//insert data pembanding
|
||||
|
||||
$inspeksi = Inspeksi::all();
|
||||
|
||||
foreach ($inspeksi as $item) {
|
||||
if (isset($item->data_pembanding)) {
|
||||
$data_pembanding = json_decode($item->data_pembanding);
|
||||
|
||||
$objekPenilaian = $data_pembanding->objek_penilaian;
|
||||
if (isset($objekPenilaian)) {
|
||||
$_lat = $objekPenilaian->kordinat_lat;
|
||||
$_lng = $objekPenilaian->kordinat_lng;
|
||||
|
||||
if (!empty($_lat) && !empty($_lng) && $_lng !== null && $_lat !== null && $_lat !== '' && $_lng !== '') {
|
||||
$_lat = floatval($_lat);
|
||||
$_lng = floatval($_lng);
|
||||
if ($_lat >= -90 && $_lat <= 90 && $_lng >= -180 && $_lng <= 180) {
|
||||
|
||||
$_data = [
|
||||
'address' => $objekPenilaian->address,
|
||||
'village_code' => $objekPenilaian->village_code,
|
||||
'district_code' => $objekPenilaian->district_code,
|
||||
'city_code' => $objekPenilaian->city_code,
|
||||
'province_code' => $objekPenilaian->province_code,
|
||||
'tahun' => $item->created_at->format('Y'),
|
||||
//
|
||||
'luas_tanah' => isset($objekPenilaian->luas_tanah) && is_numeric($objekPenilaian->luas_tanah) ? $objekPenilaian->luas_tanah : 0,
|
||||
'luas_bangunan' => isset($objekPenilaian->luas_bangunan) && is_numeric($objekPenilaian->luas_bangunan) ? $objekPenilaian->luas_bangunan : 0,
|
||||
//
|
||||
'tahun_bangunan' => isset($objekPenilaian->tahun_bangunan) && is_numeric($objekPenilaian->tahun_bangunan) ? $objekPenilaian->tahun_bangunan : 0,
|
||||
//
|
||||
'harga' => isset($objekPenilaian->harga) && is_numeric($objekPenilaian->harga) ? $objekPenilaian->harga : 0,
|
||||
'harga_diskon' => isset($objekPenilaian->harga_diskon) && is_numeric($objekPenilaian->harga_diskon) ? $objekPenilaian->harga_diskon : 0,
|
||||
'diskon' => isset($objekPenilaian->diskon) && is_numeric(str_replace(',', '.', $objekPenilaian->diskon)) ? str_replace(',', '.', $objekPenilaian->diskon) : 0,
|
||||
'total' => isset($objekPenilaian->total) && is_numeric($objekPenilaian->total) ? $objekPenilaian->total : 0,
|
||||
'harga_penawaran' => isset($objekPenilaian->harga_penawaran) && is_numeric($objekPenilaian->harga_penawaran) ? $objekPenilaian->harga_penawaran : 0,
|
||||
'nama_nara_sumber' => $objekPenilaian->nama_nara_sumber,
|
||||
'peruntukan' => $objekPenilaian->peruntukan ?? "",
|
||||
//
|
||||
'penawaran' => $objekPenilaian->penawaran ?? "",
|
||||
//
|
||||
'telepon' => $objekPenilaian->telepon ?? "",
|
||||
'hak_properti' => $objekPenilaian->hak_properti ?? "",
|
||||
'jenis_aset' => $objekPenilaian->jenis_aset ?? "",
|
||||
'foto_objek' => $objekPenilaian->foto_objek ?? "",
|
||||
'tanggal' => $objekPenilaian->tanggal ?? null,
|
||||
'kategori' => 'penilaian',
|
||||
];
|
||||
|
||||
|
||||
BankData::updateOrCreate(
|
||||
[
|
||||
'kordinat_lat' => $_lat,
|
||||
'kordinat_lng' => $_lng,
|
||||
'kategori' => 'penilaian'
|
||||
],
|
||||
$_data
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// Invalid coordinates
|
||||
Log::warning("Invalid coordinates: Lat: $_lat, Lng: $_lng");// Do something to handle this situation, such as logging an error or skipping the record
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($data_pembanding->data_pembanding as $dataPembanding) {
|
||||
$lat = $dataPembanding->kordinat_lat;
|
||||
$lng = $dataPembanding->kordinat_lng;
|
||||
|
||||
if (!empty($lat) && !empty($lng) && $lng !== null && $lat !== null && $lat !== '' && $lng !== '') {
|
||||
$lat = floatval($lat);
|
||||
$lng = floatval($lng);
|
||||
|
||||
if ($lat >= -90 && $lat <= 90 && $lng >= -180 && $lng <= 180) {
|
||||
$data = [
|
||||
'address' => $dataPembanding->address,
|
||||
'village_code' => $dataPembanding->village_code,
|
||||
'district_code' => $dataPembanding->district_code,
|
||||
'city_code' => $dataPembanding->city_code,
|
||||
'province_code' => $dataPembanding->province_code,
|
||||
'tahun' => isset($dataPembanding->tahun) && is_numeric($dataPembanding->tahun) ? $dataPembanding->tahun : 0,
|
||||
'luas_tanah' => isset($dataPembanding->luas_tanah) && is_numeric($dataPembanding->luas_tanah) ? $dataPembanding->luas_tanah : 0,
|
||||
'luas_bangunan' => isset($dataPembanding->luas_bangunan) && is_numeric($dataPembanding->luas_bangunan) ? $dataPembanding->luas_bangunan : 0,
|
||||
'tahun_bangunan' => isset($dataPembanding->tahun_bangunan) && is_numeric($dataPembanding->tahun_bangunan) ? $dataPembanding->tahun_bangunan : 0,
|
||||
'harga' => isset($dataPembanding->harga) && is_numeric($dataPembanding->harga) ? $dataPembanding->harga : 0,
|
||||
'harga_diskon' => isset($dataPembanding->harga_diskon) && is_numeric($dataPembanding->harga_diskon) ? $dataPembanding->harga_diskon : 0,
|
||||
'diskon' => isset($dataPembanding->diskon) && is_numeric(str_replace(',', '.', $dataPembanding->diskon)) ? str_replace(',', '.', $dataPembanding->diskon) : 0,
|
||||
'total' => isset($dataPembanding->total) && is_numeric($dataPembanding->total) ? $dataPembanding->total : 0,
|
||||
'harga_penawaran' => isset($dataPembanding->harga_penawaran) && is_numeric($dataPembanding->harga_penawaran) ? $dataPembanding->harga_penawaran : 0,
|
||||
'nama_nara_sumber' => $dataPembanding->nama_nara_sumber,
|
||||
'peruntukan' => $dataPembanding->peruntukan,
|
||||
'penawaran' => $dataPembanding->penawaran,
|
||||
'telepon' => $dataPembanding->telepon,
|
||||
'hak_properti' => $dataPembanding->hak_properti,
|
||||
'jenis_aset' => $dataPembanding->jenis_aset,
|
||||
'foto_objek' => $dataPembanding->foto_objek,
|
||||
'tanggal' => $dataPembanding->tanggal,
|
||||
'kategori' => 'data_pembanding',
|
||||
];
|
||||
|
||||
BankData::updateOrCreate(
|
||||
[
|
||||
'kordinat_lat' => $lat,
|
||||
'kordinat_lng' => $lng,
|
||||
'kategori' => 'data_pembanding'
|
||||
],
|
||||
$data
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// Invalid coordinates
|
||||
Log::warning("Invalid coordinates: Lat: $lat, Lng: $lng");// Do something to handle this situation, such as logging an error or skipping the record
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return view('lpj::bank-data.index', compact('provinces', 'jenisJaminan'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return view('lpj::bank-data.create');
|
||||
}
|
||||
|
||||
public function store(BankDataRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
$bankData = $this->bankDataService->createBankData($data);
|
||||
return redirect()
|
||||
->route('lpj.bank-data.show', $bankData->id)
|
||||
->with('success', 'Bank data created successfully.');
|
||||
}
|
||||
|
||||
public function show($id)
|
||||
{
|
||||
$bankData = $this->bankDataService->findBankData($id);
|
||||
return view('lpj::bank-data.show', compact('bankData'));
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
$bankData = $this->bankDataService->findBankData($id);
|
||||
return view('lpj::bank-data.edit', compact('bankData'));
|
||||
}
|
||||
|
||||
public function update(BankDataRequest $request, $id)
|
||||
{
|
||||
$data = $request->validated();
|
||||
$bankData = $this->bankDataService->updateBankData($id, $data);
|
||||
return redirect()
|
||||
->route('lpj.bank-data.show', $bankData->id)
|
||||
->with('success', 'Bank data updated successfully.');
|
||||
}
|
||||
|
||||
public function destroy($id)
|
||||
{
|
||||
$this->bankDataService->deleteBankData($id);
|
||||
return redirect()->route('lpj.bank-data.index')->with('success', 'Bank data deleted successfully.');
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('bank-data.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view bank data.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = BankData::query();
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$search = json_decode($search, true);
|
||||
if (is_array($search)) {
|
||||
|
||||
if ($search['province_code']) {
|
||||
$query->ofProvince($search['province_code']);
|
||||
}
|
||||
|
||||
if ($search['kategori']) {
|
||||
$query->where('kategori', $search['kategori']);
|
||||
}
|
||||
|
||||
if ($search['city_code']) {
|
||||
$query->ofCity($search['city_code']);
|
||||
}
|
||||
|
||||
if ($search['district_code']) {
|
||||
$query->ofDistrict($search['district_code']);
|
||||
}
|
||||
|
||||
if ($search['village_code']) {
|
||||
$query->ofVillage($search['village_code']);
|
||||
}
|
||||
|
||||
if ($search['jenis_asset']) {
|
||||
$query->ofAssetType($search['jenis_asset']);
|
||||
}
|
||||
|
||||
if ($search['tahun']) {
|
||||
$query->where('tahun', $search['tahun']);
|
||||
}
|
||||
|
||||
if ($search['start_date'] && $search['end_date']) {
|
||||
$query->betweenDates($search['start_date'], $search['end_date']);
|
||||
}
|
||||
} else {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('jenis_aset', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->get();
|
||||
|
||||
// Format the data as needed
|
||||
$formattedData = $data->map(function ($item) {
|
||||
return [
|
||||
'id' => $item->id,
|
||||
'jenis_aset' => $item->jenis_aset,
|
||||
'tanggal' => $item->tanggal ? $item->tanggal->format('d-m-Y') : '-',
|
||||
'tahun' => $item->tahun,
|
||||
'luas_tanah' => $item->luas_tanah,
|
||||
'luas_bangunan' => $item->luas_bangunan,
|
||||
'harga' => $item->harga,
|
||||
'sumber' => $item->kategori ? ucwords(str_replace('_', ' ', $item->kategori)) : '-',
|
||||
'kategori' => $item->kategori ?? 'data_pembanding',
|
||||
'nilai_pasar' => $item->nilai_pasar,
|
||||
'location' => $item->kordinat_lat . ', ' . $item->kordinat_lng,
|
||||
'address' => formatAlamat($item),
|
||||
'photos' => json_decode($item->foto_objek, true) ?: [$item->foto_objek],
|
||||
// Add more fields as needed
|
||||
];
|
||||
});
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = $request->get('page', 1);
|
||||
|
||||
// Ensure current page doesn't exceed page count
|
||||
$currentPage = min($currentPage, $pageCount);
|
||||
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $formattedData,
|
||||
]);
|
||||
}
|
||||
}
|
||||
209
app/Http/Controllers/BucokController.php
Normal file
209
app/Http/Controllers/BucokController.php
Normal file
@@ -0,0 +1,209 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Imports\BucokImport;
|
||||
use Modules\Lpj\Models\Bucok;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
/**
|
||||
* Controller untuk mengelola data Bucok
|
||||
*
|
||||
* @package Modules\Lpj\Http\Controllers
|
||||
*/
|
||||
class BucokController extends Controller
|
||||
{
|
||||
public $user;
|
||||
|
||||
/**
|
||||
* Menampilkan halaman index bucok
|
||||
*
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('lpj::bucok.index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Menampilkan detail bucok
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
$bucok = Bucok::findOrFail($id);
|
||||
return view('lpj::bucok.show', compact('bucok'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Data untuk datatables dengan server-side processing
|
||||
*
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('bucok.view')) {
|
||||
// abort(403, 'Sorry! You are not allowed to view bucok.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = Bucok::query();
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_tiket', 'LIKE', "%$search%")
|
||||
->orWhere('deskripsi', 'LIKE', "%$search%")
|
||||
->orWhere('nomor_coa', 'LIKE', "%$search%")
|
||||
->orWhere('nama_coa', 'LIKE', "%$search%")
|
||||
->orWhere('cost_center', 'LIKE', "%$search%")
|
||||
->orWhere('nama_sub_direktorat', 'LIKE', "%$search%")
|
||||
->orWhere('nama_direktorat_cabang', 'LIKE', "%$search%")
|
||||
->orWhere('penyelesaian', 'LIKE', "%$search%")
|
||||
->orWhere('keterangan_gantung', 'LIKE', "%$search%");
|
||||
});
|
||||
}
|
||||
|
||||
// Apply date range filter
|
||||
if ($request->has('start_date') && !empty($request->get('start_date'))) {
|
||||
$query->whereDate('tanggal', '>=', $request->get('start_date'));
|
||||
}
|
||||
if ($request->has('end_date') && !empty($request->get('end_date'))) {
|
||||
$query->whereDate('tanggal', '<=', $request->get('end_date'));
|
||||
}
|
||||
|
||||
// Apply year filter
|
||||
if ($request->has('year') && !empty($request->get('year'))) {
|
||||
$query->byYear($request->get('year'));
|
||||
}
|
||||
|
||||
// Apply month filter
|
||||
if ($request->has('month') && !empty($request->get('month'))) {
|
||||
$query->byMonth($request->get('month'));
|
||||
}
|
||||
|
||||
// Apply cost center filter
|
||||
if ($request->has('cost_center') && !empty($request->get('cost_center'))) {
|
||||
$query->byCostCenter($request->get('cost_center'));
|
||||
}
|
||||
|
||||
// Apply completion status filter
|
||||
if ($request->has('completion_status') && $request->get('completion_status') !== '') {
|
||||
$isCompleted = $request->get('completion_status') == '1';
|
||||
$query->byCompletionStatus($isCompleted);
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField', 'created_at');
|
||||
$query->orderBy($column, $order);
|
||||
} else {
|
||||
$query->orderBy('created_at', 'desc');
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page with relationships
|
||||
$data = $query->get();
|
||||
|
||||
// Transform data untuk datatables
|
||||
$transformedData = $data->map(function ($item) {
|
||||
return [
|
||||
'id' => $item->id,
|
||||
'no' => $item->no,
|
||||
'tanggal' => $item->tanggal ? dateFormat($item->tanggal,true) : '-',
|
||||
'bulan' => $item->bulan,
|
||||
'tahun' => $item->tahun,
|
||||
'nomor_tiket' => $item->nomor_tiket,
|
||||
'nomor_coa' => $item->nomor_coa,
|
||||
'nama_coa' => $item->nama_coa,
|
||||
'deskripsi' => $item->deskripsi,
|
||||
'nominal' => $item->nominal_formatted,
|
||||
'penyelesaian' => $item->penyelesaian,
|
||||
'umur_aging' => $item->umur_aging,
|
||||
'cost_center' => $item->cost_center,
|
||||
'nama_sub_direktorat' => $item->nama_sub_direktorat,
|
||||
'nama_direktorat_cabang' => $item->nama_direktorat_cabang,
|
||||
'tanggal_penyelesaian' => $item->tanggal_penyelesaian ? dateFormat($item->tanggal_penyelesaian,true) : '-',
|
||||
'nominal_penyelesaian' => $item->nominal_penyelesaian_formatted,
|
||||
'status_penyelesaian' => $item->status_penyelesaian,
|
||||
'status_badge' => $item->status_badge,
|
||||
'created_by' => $item->creator?->name ?? '-',
|
||||
'created_at' => dateFormat($item->created_at,true)
|
||||
];
|
||||
});
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / ($request->get('size', 10)));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = $request->get('page', 1);
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $transformedData,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Import data bucok dari Excel
|
||||
*
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
public function import(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'file' => 'required|mimes:xlsx,xls,csv|max:10240' // Max 10MB
|
||||
]);
|
||||
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
Log::info('Importing Bucok data', ['user_id' => Auth::id(), 'filename' => $request->file('file')->getClientOriginalName()]);
|
||||
|
||||
$import = new BucokImport();
|
||||
Excel::import($import, $request->file('file'));
|
||||
$statistics = $import->getImportStatistics();
|
||||
|
||||
DB::commit();
|
||||
Log::info('Bucok data imported successfully', ['user_id' => Auth::id()]);
|
||||
|
||||
return redirect()->back()->with('success', 'Data Bucok berhasil diimport. Total: ' . $statistics['total_processed'] . ', Created: ' . $statistics['created'] . ', Updated: ' . $statistics['updated'] . ', Skipped: ' . $statistics['skipped'] . ', Errors: ' . $statistics['errors']);
|
||||
} catch (Exception $e) {
|
||||
DB::rollback();
|
||||
Log::error('Failed to import Bucok data', ['error' => $e->getMessage(), 'user_id' => Auth::id()]);
|
||||
|
||||
return redirect()->back()->with('error', 'Gagal import data: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
152
app/Http/Controllers/CategoryDaftarPustakaController.php
Normal file
152
app/Http/Controllers/CategoryDaftarPustakaController.php
Normal file
@@ -0,0 +1,152 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Models\CategoryDaftarPustaka;
|
||||
use Modules\Lpj\Http\Requests\CategoryDaftarPustakaRequest;
|
||||
|
||||
class CategoryDaftarPustakaController extends Controller
|
||||
{
|
||||
public $user;
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('lpj::category-daftar-pustaka.index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
return view('lpj::category-daftar-pustaka.create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(CategoryDaftarPustakaRequest $request)
|
||||
{
|
||||
$validated = $request->validated();
|
||||
if ($validated) {
|
||||
try {
|
||||
CategoryDaftarPustaka::create($validated);
|
||||
return redirect()->route('category-daftar-pustaka.index')->with('success', 'Data Berhasil Disimpan');
|
||||
} catch (\Throwable $th) {
|
||||
return redirect()->route('category-daftar-pustaka.index')->with('error', $th->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the specified resource.
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
$category = CategoryDaftarPustaka::where('id', $id)->first();
|
||||
return view('lpj::category-daftar-pustaka.show', compact('category'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
return view('lpj::category-daftar-pustaka.create', ['category' => CategoryDaftarPustaka::where('id', $id)->first()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(CategoryDaftarPustakaRequest $request, $id)
|
||||
{
|
||||
$validated = $request->validated();
|
||||
if ($validated) {
|
||||
try {
|
||||
CategoryDaftarPustaka::where('id', $id)->update($validated);
|
||||
return redirect()->route('category-daftar-pustaka.index')->with('success', 'Data Berhasil Disimpan');
|
||||
} catch (\Throwable $th) {
|
||||
return redirect()->route('category-daftar-pustaka.index')->with('error', $th->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
try {
|
||||
CategoryDaftarPustaka::where('id', $id)->delete();
|
||||
return response()->json(['success' => true, 'message' => 'Data Berhasil Dihapus']);
|
||||
} catch (\Throwable $th) {
|
||||
return response()->json(['success' => false, 'message' => $th->getMessage()]);
|
||||
}
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('jenis_aset.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = CategoryDaftarPustaka::query();
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('code', 'LIKE', "%$search%");
|
||||
$q->orWhere('name', 'LIKE', "%$search%");
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = 0 + 1;
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
}
|
||||
153
app/Http/Controllers/CustomFieldController.php
Normal file
153
app/Http/Controllers/CustomFieldController.php
Normal file
@@ -0,0 +1,153 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Exports\CustomFieldExport;
|
||||
use Modules\Lpj\Http\Requests\CustomFieldRequest;
|
||||
use Modules\Lpj\Models\CustomField;
|
||||
|
||||
class CustomFieldController extends Controller
|
||||
{
|
||||
public $user;
|
||||
|
||||
public function index()
|
||||
{
|
||||
return view('lpj::custom_fields.index');
|
||||
}
|
||||
|
||||
public function store(CustomFieldRequest $request)
|
||||
{
|
||||
$validate = $request->validated();
|
||||
|
||||
if ($validate) {
|
||||
try {
|
||||
// Save to database
|
||||
CustomField::create($validate);
|
||||
return redirect()
|
||||
->route('basicdata.custom-field.index')
|
||||
->with('success', 'Custom Field created successfully');
|
||||
} catch (Exception $e) {
|
||||
return redirect()
|
||||
->route('basicdata.custom-field.create')
|
||||
->with('error', $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
$urutan_prioritas = CustomField::max('urutan_prioritas')+1;
|
||||
return view('lpj::custom_fields.create', compact('urutan_prioritas'));
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
$customField = CustomField::find($id);
|
||||
$urutan_prioritas = $customField->urutan_prioritas ?? CustomField::max('urutan_prioritas')+1;
|
||||
return view('lpj::custom_fields.create', compact('customField', 'urutan_prioritas' ));
|
||||
}
|
||||
|
||||
public function update(CustomFieldRequest $request, $id)
|
||||
{
|
||||
$validate = $request->validated();
|
||||
|
||||
if ($validate) {
|
||||
try {
|
||||
// Update in database
|
||||
$customField = CustomField::find($id);
|
||||
$customField->update($validate);
|
||||
return redirect()
|
||||
->route('basicdata.custom-field.index')
|
||||
->with('success', 'Custom Field updated successfully');
|
||||
} catch (Exception $e) {
|
||||
return redirect()
|
||||
->route('basicdata.custom-field.edit', $id)
|
||||
->with('error', 'Failed to update custom field');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function destroy($id)
|
||||
{
|
||||
try {
|
||||
// Delete from database
|
||||
$customField = CustomField::find($id);
|
||||
$customField->delete();
|
||||
|
||||
echo json_encode(['success' => true, 'message' => 'Custom Field deleted successfully']);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(['success' => false, 'message' => 'Failed to delete custom field']);
|
||||
}
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('custom_fields.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view custom fields.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = CustomField::query();
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('name', 'LIKE', "%$search%");
|
||||
$q->orWhere('label', 'LIKE', "%$search%");
|
||||
$q->orWhere('type', 'LIKE', "%$search%");
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = 0 + 1;
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function export()
|
||||
{
|
||||
return Excel::download(new CustomFieldExport, 'custom_fields.xlsx');
|
||||
}
|
||||
}
|
||||
129
app/Http/Controllers/DaftarPustakaController.php
Normal file
129
app/Http/Controllers/DaftarPustakaController.php
Normal file
@@ -0,0 +1,129 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Models\CategoryDaftarPustaka;
|
||||
use Modules\Lpj\Services\DaftarPustakaService;
|
||||
use Modules\Lpj\Http\Requests\DaftarPustakaRequest;
|
||||
|
||||
class DaftarPustakaController extends Controller
|
||||
{
|
||||
private $daftarPustaka;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->daftarPustaka = app(DaftarPustakaService::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
$categories = CategoryDaftarPustaka::all();
|
||||
$daftar_pustaka = $this->daftarPustaka->getAllDaftarPustaka($request);
|
||||
|
||||
return view('lpj::daftar-pustaka.index', [
|
||||
'categories' => $categories,
|
||||
'daftar_pustaka' => $daftar_pustaka,
|
||||
'page' => $daftar_pustaka->currentPage(),
|
||||
'pageCount' => $daftar_pustaka->lastPage(),
|
||||
'limit' => $daftar_pustaka->perPage(),
|
||||
'total' => $daftar_pustaka->total(),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
$categories = CategoryDaftarPustaka::all();
|
||||
// dd($categories);
|
||||
return view('lpj::daftar-pustaka.create', compact('categories'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(DaftarPustakaRequest $request)
|
||||
{
|
||||
|
||||
$validate = $request->validated();
|
||||
// dd($validate);
|
||||
$file = $request->file('attachment');
|
||||
if ($validate) {
|
||||
try {
|
||||
// Save to database
|
||||
$this->daftarPustaka->storeDaftarPustaka($validate, $file);
|
||||
return redirect()
|
||||
->route('daftar-pustaka.index')
|
||||
->with('success', 'Daftar Pustaka created successfully');
|
||||
} catch (Exception $e) {
|
||||
return redirect()
|
||||
->route('daftar-pustaka.create')
|
||||
->with('error', 'Failed to create daftar pustaka');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the specified resource.
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
$daftarPustaka = $this->daftarPustaka->getDaftarPustakaById($id);
|
||||
$categories = CategoryDaftarPustaka::all();
|
||||
|
||||
return view('lpj::daftar-pustaka.show', compact('daftarPustaka', 'categories'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
$daftarPustaka = $this->daftarPustaka->getDaftarPustakaById($id);
|
||||
$categories = CategoryDaftarPustaka::all();
|
||||
return view('lpj::daftar-pustaka.create', compact('daftarPustaka', 'categories'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(DaftarPustakaRequest $request, $id)
|
||||
{
|
||||
$validate = $request->validated();
|
||||
if ($validate) {
|
||||
try {
|
||||
// Save to database
|
||||
$file = $request->file('attachment');
|
||||
$this->daftarPustaka->updateDaftarPustaka($validate, $file, $id);
|
||||
return redirect()
|
||||
->route('daftar-pustaka.index')
|
||||
->with('success', 'Daftar Pustaka updated successfully');
|
||||
} catch (Exception $e) {
|
||||
return redirect()
|
||||
->route('daftar-pustaka.create')
|
||||
->with('error', 'Failed to update daftar pustaka');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
try {
|
||||
$this->daftarPustaka->deleteDaftarPustaka($id);
|
||||
return response()->json(['success' => true, 'message' => 'Daftar Pustaka deleted successfully']);
|
||||
} catch (Exception $e) {
|
||||
return response()->json(['success' => false, 'message' => 'Failed to delete daftar pustaka']);
|
||||
}
|
||||
}
|
||||
}
|
||||
36
app/Http/Controllers/DashboardController.php
Normal file
36
app/Http/Controllers/DashboardController.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Services\DashboardService;
|
||||
|
||||
class DashboardController extends Controller
|
||||
{
|
||||
public $dashboardService;
|
||||
public function __construct(DashboardService $dashboardService)
|
||||
{
|
||||
$this->dashboardService = $dashboardService;
|
||||
}
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
// nilai default
|
||||
$start_date = $request->input('start_date', now()->startOfYear()->format('Y-m-d'));
|
||||
$end_date = $request->input('end_date', now()->format('Y-m-d'));
|
||||
|
||||
$validate = $request->validate([
|
||||
'start_date' => 'nullable|date_format:Y-m-d',
|
||||
'end_date' => 'nullable|date_format:Y-m-d',
|
||||
]);
|
||||
|
||||
$dashboard = $this->dashboardService->getDashboardData($start_date, $end_date);
|
||||
|
||||
// dd($dashboard);
|
||||
return view('lpj::dashboard.index', compact('dashboard'));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -19,6 +19,7 @@
|
||||
use Modules\Lpj\Models\JenisJaminan;
|
||||
use Modules\Lpj\Models\JenisLegalitasJaminan;
|
||||
use Modules\Lpj\Models\PemilikJaminan;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class DebitureController extends Controller
|
||||
{
|
||||
@@ -93,13 +94,29 @@
|
||||
public function destroy($id)
|
||||
{
|
||||
try {
|
||||
// Delete from database
|
||||
// Periksa apakah pengguna adalah administrator
|
||||
if (!auth()->user()->hasRole('administrator')) {
|
||||
return response()->json(['success' => false, 'message' => 'Hanya administrator yang dapat menghapus debitur'], 403);
|
||||
}
|
||||
|
||||
// Temukan debitur
|
||||
$debitur = Debiture::find($id);
|
||||
|
||||
if (!$debitur) {
|
||||
return response()->json(['success' => false, 'message' => 'Debitur tidak ditemukan'], 404);
|
||||
}
|
||||
|
||||
// Periksa apakah debitur memiliki permohonan aktif
|
||||
if ($debitur->permohonan()->exists()) {
|
||||
return response()->json(['success' => false, 'message' => 'Tidak dapat menghapus debitur yang masih memiliki permohonan aktif'], 400);
|
||||
}
|
||||
|
||||
// Hapus dari database
|
||||
$debitur->delete();
|
||||
|
||||
echo json_encode(['success' => true, 'message' => 'Debitur deleted successfully']);
|
||||
return response()->json(['success' => true, 'message' => 'Debitur berhasil dihapus']);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(['success' => false, 'message' => 'Failed to delete debitur']);
|
||||
return response()->json(['success' => false, 'message' => 'Gagal menghapus debitur: ' . $e->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,6 +129,10 @@
|
||||
// Retrieve data from the database
|
||||
$query = Debiture::query();
|
||||
|
||||
if (!Auth::user()->hasAnyRole(['administrator','admin'])) {
|
||||
$query = $query->where('branch_id', Auth::user()->branch_id);
|
||||
}
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
@@ -151,7 +172,7 @@
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->with('branch')->get();
|
||||
$data = $query->with(['branch','permohonan'])->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
@@ -4,15 +4,19 @@
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use Log;
|
||||
use Modules\Location\Models\City;
|
||||
use Modules\Location\Models\District;
|
||||
use Modules\Location\Models\Province;
|
||||
use Modules\Location\Models\Village;
|
||||
use Modules\Lpj\Http\Requests\DokumenJaminanRequest;
|
||||
use Modules\Lpj\Models\CustomField;
|
||||
use Modules\Lpj\Models\Debiture;
|
||||
use Modules\Lpj\Models\DetailDokumenJaminan;
|
||||
use Modules\Lpj\Models\DokumenJaminan;
|
||||
@@ -20,6 +24,7 @@
|
||||
use Modules\Lpj\Models\JenisJaminan;
|
||||
use Modules\Lpj\Models\JenisLegalitasJaminan;
|
||||
use Modules\Lpj\Models\PemilikJaminan;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use ZipArchive;
|
||||
|
||||
class DokumenJaminanController extends Controller
|
||||
@@ -31,6 +36,13 @@
|
||||
{
|
||||
$debitur = Debiture::find($id);
|
||||
$documents = DokumenJaminan::with('pemilik', 'detail')->where('debiture_id', $id)->get();
|
||||
if (request()->get('permohonan_id') !== null) {
|
||||
$permohonan_id = request()->get('permohonan_id');
|
||||
$documents = DokumenJaminan::with('pemilik', 'detail')
|
||||
->where('debiture_id', $id)
|
||||
->where('permohonan_id', $permohonan_id)
|
||||
->get();
|
||||
}
|
||||
|
||||
return view(
|
||||
'lpj::debitur.edit',
|
||||
@@ -79,6 +91,7 @@
|
||||
'jenis_legalitas_jaminan_id' => $value,
|
||||
'name' => $request->name[$key],
|
||||
'keterangan' => $request->keterangan[$key],
|
||||
'details' => isset($request->custom_field[$key]) ? json_encode($request->custom_field[$key]) : ''
|
||||
];
|
||||
|
||||
$dokumenJaminan = [];
|
||||
@@ -92,7 +105,7 @@
|
||||
$file_name,
|
||||
);
|
||||
$dokumenJaminan[] = 'jaminan/' . $debitur->id . '/' . $document->id . '/' . $file_name;
|
||||
$dokumenNomor[] = $request->dokumen_nomor[$key][$index] ?? '';
|
||||
$dokumenNomor[] = $request->dokumen_nomor[$key][$index] ?? '-';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -107,13 +120,13 @@
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
return redirect()->route('debitur.jaminan.index', $id)->with(
|
||||
return redirect()->route('debitur.jaminan.index',['id'=>$id,'pemrohonan_id' => $validate['permohonan_id'] ])->with(
|
||||
'success',
|
||||
'Dokumen Jaminan berhasil ditambahkan',
|
||||
);
|
||||
} catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
return redirect()->route('debitur.jaminan.index', $id)->with('error', 'ggl' . $e->getMessage());
|
||||
return redirect()->route('debitur.jaminan.create',['id'=>$id,'pemrohonan_id' => $validate['permohonan_id'] ])->with('error', $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -126,7 +139,10 @@
|
||||
$jenisLegalitasJaminan = JenisLegalitasJaminan::all();
|
||||
$pemilikJaminan = PemilikJaminan::where('debiture_id', $id)->get();
|
||||
$hubunganPemilik = HubunganPemilikJaminan::all();
|
||||
|
||||
$permohonan = null;
|
||||
if(request()->get('permohonan_id')) {
|
||||
$permohonan = Permohonan::where('id', request()->get('permohonan_id'))->first();
|
||||
}
|
||||
return view(
|
||||
'lpj::debitur.jaminan',
|
||||
compact(
|
||||
@@ -136,6 +152,7 @@
|
||||
'jenisLegalitasJaminan',
|
||||
'pemilikJaminan',
|
||||
'hubunganPemilik',
|
||||
'permohonan'
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -145,7 +162,6 @@
|
||||
$debitur = Debiture::find($id);
|
||||
|
||||
$validate = $request->validated();
|
||||
|
||||
if ($validate) {
|
||||
try {
|
||||
DB::beginTransaction();
|
||||
@@ -234,67 +250,119 @@
|
||||
'jenis_legalitas_jaminan_id' => $value,
|
||||
'name' => $request->name[$key],
|
||||
'keterangan' => $request->keterangan[$key],
|
||||
'details' => isset($request->custom_field[$key]) ? json_encode(array_values($request->custom_field[$key])) : ''
|
||||
];
|
||||
|
||||
$dokumenJaminan = [];
|
||||
$dokumenNomor=[];
|
||||
$dokumenNomor = [];
|
||||
|
||||
if (isset($request->dokumen_jaminan[$key]) && is_array($request->dokumen_jaminan[$key])) {
|
||||
foreach ($request->dokumen_jaminan[$key] as $index => $file) {
|
||||
if ($file) {
|
||||
if ($file instanceof \Illuminate\Http\UploadedFile) {
|
||||
// Jika file baru diupload
|
||||
$file_name = $file->getClientOriginalName();
|
||||
$file->storeAs(
|
||||
'public/jaminan/' . $debitur->id . '/' . $document->id . '/',
|
||||
$file_name,
|
||||
);
|
||||
$dokumenJaminan[] = 'jaminan/' . $debitur->id . '/' . $document->id . '/' . $file_name;
|
||||
$dokumenNomor[] = $request->dokumen_nomor[$key][$index] ?? '';
|
||||
} elseif (is_string($file) && !empty($file)) {
|
||||
// Jika file tidak diubah, gunakan path yang sudah ada
|
||||
$dokumenJaminan[] = $file;
|
||||
} else {
|
||||
// Jika file kosong atau null, tambahkan placeholder atau skip
|
||||
$dokumenJaminan[] = null; // atau skip dengan continue;
|
||||
}
|
||||
|
||||
// Selalu update dokumen_nomor, baik file diubah atau tidak
|
||||
$dokumenNomor[] = $request->dokumen_nomor[$key][$index] ?? '-';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Setelah loop, periksa apakah ada dokumen yang dihapus
|
||||
$existingDetail = $existingDetails->get($request->detail_dokumen_jaminan_id[$key] ?? null);
|
||||
|
||||
if ($existingDetail) {
|
||||
$existingDokumen = json_decode($existingDetail->dokumen_jaminan, true) ?? [];
|
||||
$existingNomor = json_decode($existingDetail->dokumen_nomor, true) ?? [];
|
||||
|
||||
$newDokumenJaminan = [];
|
||||
$newDokumenNomor = [];
|
||||
|
||||
$allFilesDeleted = true;
|
||||
|
||||
foreach ($existingDokumen as $index => $existingFile) {
|
||||
if (isset($request->dokumen_jaminan[$key][$index])) {
|
||||
$allFilesDeleted = false;
|
||||
$file = $request->dokumen_jaminan[$key][$index];
|
||||
if ($file instanceof \Illuminate\Http\UploadedFile) {
|
||||
// File baru diupload
|
||||
$file_name = $file->getClientOriginalName();
|
||||
$file->storeAs('public/jaminan/' . $debitur->id . '/' . $document->id . '/', $file_name);
|
||||
$newDokumenJaminan[] = 'jaminan/' . $debitur->id . '/' . $document->id . '/' . $file_name;
|
||||
$newDokumenNomor[] = $request->dokumen_nomor[$key][$index] ?? '-';
|
||||
} elseif (is_string($file) && !empty($file)) {
|
||||
// File tidak diubah
|
||||
$newDokumenJaminan[] = $existingFile;
|
||||
$newDokumenNomor[] = $request->dokumen_nomor[$key][$index] ?? $existingNomor[$index];
|
||||
}
|
||||
} else {
|
||||
// File dihapus, hapus dari storage jika ada
|
||||
if (Storage::exists('public/' . $existingFile)) {
|
||||
Storage::delete('public/' . $existingFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Tambahkan file baru yang mungkin ditambahkan
|
||||
foreach ($request->dokumen_jaminan[$key] ?? [] as $index => $file) {
|
||||
if ($file instanceof UploadedFile) {
|
||||
$allFilesDeleted = false;
|
||||
$file_name = $file->getClientOriginalName();
|
||||
$path = 'jaminan/' . $debitur->id . '/' . $document->id . '/' . $file_name;
|
||||
if (!in_array($path, $newDokumenJaminan)) {
|
||||
$file->storeAs('public/' . dirname($path), $file_name);
|
||||
$newDokumenJaminan[] = $path;
|
||||
$newDokumenNomor[] = $request->dokumen_nomor[$key][$index] ?? '-';
|
||||
}
|
||||
} elseif (is_string($file) && !empty($file) && !in_array($file, $newDokumenJaminan)) {
|
||||
$allFilesDeleted = false;
|
||||
$newDokumenJaminan[] = $file;
|
||||
$newDokumenNomor[] = $request->dokumen_nomor[$key][$index] ?? '-';
|
||||
}
|
||||
}
|
||||
|
||||
if ($allFilesDeleted) {
|
||||
$dokumenJaminan = [];
|
||||
$dokumenNomor = [];
|
||||
} else {
|
||||
$dokumenJaminan = $newDokumenJaminan;
|
||||
$dokumenNomor = $newDokumenNomor;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (!empty($dokumenJaminan)) {
|
||||
$detailData['dokumen_jaminan'] = json_encode($dokumenJaminan);
|
||||
$detailData['dokumen_nomor'] = json_encode($dokumenNomor);
|
||||
$detailData['dokumen_nomor'] = json_encode($dokumenNomor);
|
||||
} else if(empty($dokumenJaminan)){
|
||||
$detailData['dokumen_jaminan'] = null;
|
||||
$detailData['dokumen_nomor'] = null;
|
||||
}
|
||||
|
||||
if (isset($request->detail_dokumen_jaminan_id[$key])) {
|
||||
$detailId = $request->detail_dokumen_jaminan_id[$key];
|
||||
$detailDocument = $existingDetails->get($detailId);
|
||||
if ($detailDocument) {
|
||||
// Merge new files with existing ones
|
||||
if (!empty($dokumenJaminan)) {
|
||||
$existingFiles = json_decode(
|
||||
$detailDocument->dokumen_jaminan,
|
||||
true,
|
||||
) ?: [];
|
||||
$existingNomor = json_decode(
|
||||
$detailDocument->dokumen_nomor,
|
||||
true,
|
||||
) ?: [];
|
||||
$mergedFiles = array_merge($existingFiles, $dokumenJaminan);
|
||||
$mergedNomor = array_merge($existingNomor, $dokumenNomor);
|
||||
$detailData['dokumen_jaminan'] = json_encode($mergedFiles);
|
||||
$detailData['dokumen_nomor'] = json_encode($mergedNomor);
|
||||
}
|
||||
$detailDocument->update($detailData);
|
||||
$existingDetails->forget($detailId);
|
||||
}
|
||||
$detailDocument->update($detailData);
|
||||
|
||||
} else {
|
||||
DetailDokumenJaminan::create($detailData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Delete any remaining existing details that weren't updated
|
||||
foreach ($existingDetails as $detail) {
|
||||
$files = json_decode($detail->dokumen_jaminan, true) ?: [];
|
||||
foreach ($files as $file) {
|
||||
Storage::delete('public/' . $file);
|
||||
}
|
||||
$detail->delete();
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
return redirect()->route('debitur.jaminan.index', $id)->with(
|
||||
'success',
|
||||
@@ -310,7 +378,8 @@
|
||||
public function edit(
|
||||
$id,
|
||||
$jaminan,
|
||||
) {
|
||||
)
|
||||
{
|
||||
$document = DokumenJaminan::find($jaminan);
|
||||
$details = DetailDokumenJaminan::where('dokumen_jaminan_id', $document->id)->get();
|
||||
|
||||
@@ -324,19 +393,25 @@
|
||||
$jenisJaminan = JenisJaminan::all();
|
||||
$jenisLegalitasJaminan = JenisLegalitasJaminan::all();
|
||||
|
||||
$_jenisJaminan = JenisJaminan::find($document->jenis_jaminan_id);
|
||||
$legalitasJaminan = json_decode($_jenisJaminan->jenis_legalitas_jaminan_id, true);
|
||||
$_jenisJaminan = JenisJaminan::find($document->jenis_jaminan_id);
|
||||
|
||||
$currentLegalitasJaminan = JenisLegalitasJaminan::whereIn(
|
||||
'id',
|
||||
$document->detail->pluck('jenis_legalitas_jaminan_id')->toArray(),
|
||||
)->get();
|
||||
$legalitas = '';
|
||||
if ($_jenisJaminan) {
|
||||
$legalitasJaminan = json_decode($_jenisJaminan->jenis_legalitas_jaminan_id, true);
|
||||
|
||||
$currentLegalitasJaminan = JenisLegalitasJaminan::whereIn(
|
||||
'id',
|
||||
$document->detail->pluck('jenis_legalitas_jaminan_id')->toArray(),
|
||||
)->get();
|
||||
|
||||
|
||||
// Remove values from $legalitasJaminan that are in $currentLegalitasJaminan
|
||||
$legalitasJaminan = array_diff($legalitasJaminan, $currentLegalitasJaminan->pluck('code')->toArray());
|
||||
// Remove values from $legalitasJaminan that are in $currentLegalitasJaminan
|
||||
$legalitasJaminan = is_array($legalitasJaminan)
|
||||
? array_diff($legalitasJaminan, $currentLegalitasJaminan->pluck('code')->toArray())
|
||||
: [];
|
||||
|
||||
$legalitas = JenisLegalitasJaminan::whereIn('code', $legalitasJaminan)->get();
|
||||
$legalitas = JenisLegalitasJaminan::whereIn('code', $legalitasJaminan)->get();
|
||||
}
|
||||
|
||||
$pemilikJaminan = PemilikJaminan::where('debiture_id', $document->debiture_id)->get();
|
||||
$hubunganPemilik = HubunganPemilikJaminan::all();
|
||||
@@ -363,25 +438,48 @@
|
||||
public function destroy(
|
||||
$id,
|
||||
$jaminan_id,
|
||||
) {
|
||||
)
|
||||
{
|
||||
try {
|
||||
// Periksa apakah pengguna adalah admin
|
||||
if (!auth()->user()->hasRole('administrator')) {
|
||||
//return response()->json(['success' => false, 'message' => 'Hanya administrator yang dapat menghapus dokumen jaminan'], 403);
|
||||
}
|
||||
|
||||
$jaminan = DokumenJaminan::find($jaminan_id);
|
||||
|
||||
if (!$jaminan) {
|
||||
return response()->json(['success' => false, 'message' => 'Dokumen Jaminan tidak ditemukan'], 404);
|
||||
}
|
||||
|
||||
// Periksa apakah dokumen jaminan terkait dengan permohonan aktif
|
||||
if ($jaminan->permohonan()->exists() && !in_array($jaminan->permohonan->status,['order','revisi'])) {
|
||||
// return response()->json(['success' => false, 'message' => 'Tidak dapat menghapus dokumen jaminan yang terkait dengan permohonan aktif'], 400);
|
||||
}
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
$details = DetailDokumenJaminan::where('dokumen_jaminan_id', $jaminan->id)->get();
|
||||
foreach ($details as $detail) {
|
||||
Storage::delete('public/' . $detail->dokumen_jaminan);
|
||||
$detail->delete();
|
||||
}
|
||||
$jaminan->delete();
|
||||
echo json_encode(['success' => true, 'message' => 'Dokumen Jaminan deleted successfully']);
|
||||
|
||||
DB::commit();
|
||||
|
||||
return response()->json(['success' => true, 'message' => 'Dokumen Jaminan berhasil dihapus']);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(['success' => false, 'message' => 'Failed to delete Dokumen Jaminan']);
|
||||
DB::rollBack();
|
||||
return response()->json(['success' => false, 'message' => 'Gagal menghapus Dokumen Jaminan: ' . $e->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
|
||||
public function bulkDownload()
|
||||
{
|
||||
$dokumenIds = request()->get('jaminan'); // Expecting an array of dokumen_jaminan_id
|
||||
$documents = DetailDokumenJaminan::where('dokumen_jaminan_id', $dokumenIds)->get();
|
||||
$documents = DokumenJaminan::where('id', $dokumenIds)->with(['jenisJaminan', 'detail', 'debiture'])->get();
|
||||
|
||||
if ($documents->isEmpty()) {
|
||||
return redirect()->back()->with('error', 'No documents found for the provided IDs.');
|
||||
}
|
||||
@@ -392,17 +490,25 @@
|
||||
|
||||
if ($zip->open($zipFilePath, ZipArchive::CREATE) === true) {
|
||||
foreach ($documents as $document) {
|
||||
$files = is_array(json_decode($document->dokumen_jaminan)) ? json_decode(
|
||||
$document->dokumen_jaminan,
|
||||
) : [$document->dokumen_jaminan];
|
||||
$jenisJaminan = $document->permohonan->nomor_registrasi ?? 'Uncategorized';
|
||||
$folderName = $this->sanitizeFolderName($jenisJaminan);
|
||||
|
||||
foreach ($files as $file) {
|
||||
$filePath = storage_path('app/public/' . $file);
|
||||
if (file_exists($filePath)) {
|
||||
$zip->addFile($filePath, basename($filePath));
|
||||
} else {
|
||||
// Log or display an error message for missing files
|
||||
return redirect()->back()->with('error', 'File not found: ' . $filePath);
|
||||
foreach ($document->detail as $detail) {
|
||||
if ($detail->dokumen_jaminan) {
|
||||
$folderJaminanName = $this->sanitizeFolderName($detail->jenisLegalitasJaminan->name ?? 'Uncategorized');
|
||||
$files = is_array(json_decode($detail->dokumen_jaminan))
|
||||
? json_decode($detail->dokumen_jaminan)
|
||||
: [$detail->dokumen_jaminan];
|
||||
|
||||
foreach ($files as $file) {
|
||||
$filePath = storage_path('app/public/' . $file);
|
||||
if (file_exists($filePath)) {
|
||||
$zip->addFile($filePath, $folderName . '/' . $folderJaminanName . '/' . basename($filePath));
|
||||
} else {
|
||||
// Log or display an error message for missing files
|
||||
Log::warning('File not found: ' . $filePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -419,7 +525,13 @@
|
||||
'Content-Type' => 'application/zip',
|
||||
'Content-Disposition' => 'attachment; filename="' . $zipFileName . '"',
|
||||
'Content-Length' => filesize($zipFilePath),
|
||||
])->deleteFileAfterSend(false);
|
||||
])->deleteFileAfterSend(true);
|
||||
}
|
||||
|
||||
private function sanitizeFolderName($name)
|
||||
{
|
||||
// Remove any characters that are not allowed in folder names
|
||||
return preg_replace('/[^a-zA-Z0-9_\-]/', '_', $name);
|
||||
}
|
||||
|
||||
|
||||
@@ -444,7 +556,8 @@
|
||||
|
||||
|
||||
public function getLegalitasJaminan($id = 10, $jenisJaminanId = 1)
|
||||
: JsonResponse {
|
||||
: JsonResponse
|
||||
{
|
||||
$jenisJaminan = JenisJaminan::findOrFail($jenisJaminanId);
|
||||
$legalitasJaminan = $jenisJaminan->jenis_legalitas_jaminan_id;
|
||||
$newLegalitasJaminan = JenisLegalitasJaminan::whereIn('code', json_decode($legalitasJaminan, true))->get();
|
||||
@@ -461,6 +574,12 @@
|
||||
foreach ($document->detail as $detail) {
|
||||
// Only include existing legalitas if its id is in the new set
|
||||
if (in_array($detail->jenis_legalitas_jaminan_id, $newLegalitasIds)) {
|
||||
$customFields = [];
|
||||
if($detail->jenisLegalitasJaminan->custom_fields) {
|
||||
$customFields = CustomField::whereIn('id', $detail->jenisLegalitasJaminan->custom_fields)
|
||||
->get();
|
||||
}
|
||||
|
||||
$existingLegalitas[] = [
|
||||
'id' => $detail->id,
|
||||
'jenis_legalitas_jaminan_id' => $detail->jenis_legalitas_jaminan_id,
|
||||
@@ -468,10 +587,11 @@
|
||||
'dokumen_jaminan' => json_decode(
|
||||
$detail->dokumen_jaminan,
|
||||
) ?? $detail->dokumen_jaminan,
|
||||
'dokumen_nomor' => json_decode(
|
||||
'dokumen_nomor' => json_decode(
|
||||
$detail->dokumen_nomor,
|
||||
) ?? $detail->dokumen_nomor,
|
||||
'custom_field' => $detail->jenisLegalitasJaminan->custom_field,
|
||||
'custom_fields' => $customFields,
|
||||
'custom_field_type' => $detail->jenisLegalitasJaminan->custom_field_type,
|
||||
'details' => $detail->details,
|
||||
'keterangan' => $detail->keterangan,
|
||||
@@ -484,14 +604,20 @@
|
||||
|
||||
foreach ($newLegalitasJaminan as $legalitas) {
|
||||
if (!Collection::make($existingLegalitas)->contains('jenis_legalitas_jaminan_id', $legalitas->id)) {
|
||||
$customFields = [];
|
||||
if($legalitas->custom_fields) {
|
||||
$customFields = CustomField::whereIn('id', $legalitas->custom_fields)->get();
|
||||
}
|
||||
|
||||
$newLegalitas[] = [
|
||||
'id' => null,
|
||||
'jenis_legalitas_jaminan_id' => $legalitas->id,
|
||||
'name' => $legalitas->name,
|
||||
'dokumen_jaminan' => null,
|
||||
'dokumen_nomor' => null,
|
||||
'dokumen_nomor' => null,
|
||||
'custom_field' => $legalitas->custom_field,
|
||||
'custom_field_type' => $legalitas->custom_field_type,
|
||||
'custom_fields' => $customFields,
|
||||
'details' => null,
|
||||
'keterangan' => null,
|
||||
'is_existing' => false,
|
||||
@@ -502,4 +628,40 @@
|
||||
$combinedLegalitas = array_merge($existingLegalitas, $newLegalitas);
|
||||
return response()->json($combinedLegalitas);
|
||||
}
|
||||
|
||||
public function clearDetail(Request $request)
|
||||
{
|
||||
try {
|
||||
DB::beginTransaction();
|
||||
|
||||
$detailId = $request->input('detail_id');
|
||||
$detail = DetailDokumenJaminan::findOrFail($detailId);
|
||||
|
||||
// Delete associated files
|
||||
if ($detail->dokumen_jaminan) {
|
||||
$dokumen_jaminan = is_array(json_decode($detail->dokumen_jaminan))
|
||||
? json_decode($detail->dokumen_jaminan)
|
||||
: [$detail->dokumen_jaminan];
|
||||
|
||||
foreach ($dokumen_jaminan as $dokumen) {
|
||||
if (Storage::exists($dokumen)) {
|
||||
Storage::delete($dokumen);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Delete the detail record
|
||||
$detail->delete();
|
||||
|
||||
DB::commit();
|
||||
|
||||
return response()->json(['success' => true, 'message' => 'Detail berhasil dihapus']);
|
||||
} catch (\Exception $e) {
|
||||
DB::rollBack();
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Gagal menghapus detail: ' . $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
239
app/Http/Controllers/InspeksiController.php
Normal file
239
app/Http/Controllers/InspeksiController.php
Normal file
@@ -0,0 +1,239 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Modules\Lpj\Models\Inspeksi;
|
||||
use Modules\Lpj\Services\InspeksiCleanupService;
|
||||
|
||||
/**
|
||||
* Controller contoh untuk menunjukkan penggunaan InspeksiCleanupService
|
||||
*
|
||||
* Controller ini berisi contoh method untuk membuat dan update data inspeksi
|
||||
* dengan otomatis menjalankan cleanup data lama yang tidak memiliki dokument_id
|
||||
*/
|
||||
class InspeksiController extends Controller
|
||||
{
|
||||
protected InspeksiCleanupService $cleanupService;
|
||||
|
||||
public function __construct(InspeksiCleanupService $cleanupService)
|
||||
{
|
||||
$this->cleanupService = $cleanupService;
|
||||
}
|
||||
|
||||
/**
|
||||
* Contoh method untuk membuat data inspeksi baru
|
||||
*
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'permohonan_id' => 'required|integer|exists:permohonan,id',
|
||||
'dokument_id' => 'nullable|integer|exists:dokumen_jaminan,id',
|
||||
'data_form' => 'required|json',
|
||||
'foto_form' => 'nullable|json',
|
||||
'denah_form' => 'nullable|json',
|
||||
'name' => 'required|string|max:255',
|
||||
'status' => 'required|string|max:50',
|
||||
]);
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
// Buat data inspeksi baru
|
||||
$inspeksi = Inspeksi::create(array_merge($validated, [
|
||||
'created_by' => Auth::id(),
|
||||
'updated_by' => Auth::id(),
|
||||
]));
|
||||
|
||||
Log::info('InspeksiController: Data inspeksi berhasil dibuat', [
|
||||
'inspeksi_id' => $inspeksi->id,
|
||||
'permohonan_id' => $inspeksi->permohonan_id,
|
||||
'dokument_id' => $inspeksi->dokument_id,
|
||||
'created_by' => $inspeksi->created_by
|
||||
]);
|
||||
|
||||
// Commit transaksi utama
|
||||
DB::commit();
|
||||
|
||||
// Jalankan cleanup secara async jika ada dokument_id
|
||||
// Ini akan menghapus data lama yang tidak memiliki dokument_id
|
||||
if ($inspeksi->dokument_id) {
|
||||
Log::info('InspeksiController: Memulai cleanup data lama', [
|
||||
'permohonan_id' => $inspeksi->permohonan_id,
|
||||
'created_by' => $inspeksi->created_by,
|
||||
'dokument_id' => $inspeksi->dokument_id
|
||||
]);
|
||||
|
||||
// Dispatch job cleanup secara async
|
||||
$this->cleanupService->cleanupAsync(
|
||||
$inspeksi->permohonan_id,
|
||||
$inspeksi->created_by,
|
||||
$inspeksi->dokument_id
|
||||
);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Data inspeksi berhasil dibuat',
|
||||
'data' => $inspeksi->load(['permohonan', 'dokument'])
|
||||
], 201);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
DB::rollBack();
|
||||
|
||||
Log::error('InspeksiController: Gagal membuat data inspeksi', [
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString()
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Gagal membuat data inspeksi: ' . $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Contoh method untuk update data inspeksi
|
||||
*
|
||||
* @param Request $request
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'dokument_id' => 'nullable|integer|exists:dokumen_jaminan,id',
|
||||
'data_form' => 'required|json',
|
||||
'foto_form' => 'nullable|json',
|
||||
'denah_form' => 'nullable|json',
|
||||
'name' => 'required|string|max:255',
|
||||
'status' => 'required|string|max:50',
|
||||
]);
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
$inspeksi = Inspeksi::findOrFail($id);
|
||||
|
||||
// Simpan data lama untuk logging
|
||||
$oldDokumentId = $inspeksi->dokument_id;
|
||||
|
||||
// Update data
|
||||
$inspeksi->update(array_merge($validated, [
|
||||
'updated_by' => Auth::id(),
|
||||
]));
|
||||
|
||||
Log::info('InspeksiController: Data inspeksi berhasil diupdate', [
|
||||
'inspeksi_id' => $inspeksi->id,
|
||||
'permohonan_id' => $inspeksi->permohonan_id,
|
||||
'old_dokument_id' => $oldDokumentId,
|
||||
'new_dokument_id' => $inspeksi->dokument_id,
|
||||
'updated_by' => $inspeksi->updated_by
|
||||
]);
|
||||
|
||||
// Commit transaksi utama
|
||||
DB::commit();
|
||||
|
||||
// Jalankan cleanup jika dokument_id berubah dari null ke ada nilai
|
||||
if (!$oldDokumentId && $inspeksi->dokument_id) {
|
||||
Log::info('InspeksiController: Dokument ID berubah dari null, memulai cleanup', [
|
||||
'inspeksi_id' => $inspeksi->id,
|
||||
'permohonan_id' => $inspeksi->permohonan_id,
|
||||
'created_by' => $inspeksi->created_by,
|
||||
'new_dokument_id' => $inspeksi->dokument_id
|
||||
]);
|
||||
|
||||
// Dispatch job cleanup secara async
|
||||
$this->cleanupService->cleanupAsync(
|
||||
$inspeksi->permohonan_id,
|
||||
$inspeksi->created_by,
|
||||
$inspeksi->dokument_id
|
||||
);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Data inspeksi berhasil diupdate',
|
||||
'data' => $inspeksi->load(['permohonan', 'dokument'])
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
DB::rollBack();
|
||||
|
||||
Log::error('InspeksiController: Gagal update data inspeksi', [
|
||||
'inspeksi_id' => $id,
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString()
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Gagal update data inspeksi: ' . $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Contoh method untuk menjalankan cleanup secara manual
|
||||
*
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function cleanup(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'permohonan_id' => 'required|integer|exists:permohonan,id',
|
||||
'created_by' => 'required|integer|exists:users,id',
|
||||
'sync' => 'boolean', // Opsional, default false (async)
|
||||
]);
|
||||
|
||||
try {
|
||||
$permohonanId = $validated['permohonan_id'];
|
||||
$createdBy = $validated['created_by'];
|
||||
$sync = $validated['sync'] ?? false;
|
||||
|
||||
Log::info('InspeksiController: Menjalankan cleanup manual', [
|
||||
'permohonan_id' => $permohonanId,
|
||||
'created_by' => $createdBy,
|
||||
'sync' => $sync
|
||||
]);
|
||||
|
||||
if ($sync) {
|
||||
// Jalankan secara sync
|
||||
$this->cleanupService->cleanupSync($permohonanId, $createdBy);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Cleanup selesai dijalankan secara synchronous'
|
||||
]);
|
||||
} else {
|
||||
// Dispatch ke queue
|
||||
$this->cleanupService->cleanupAsync($permohonanId, $createdBy);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Cleanup job berhasil di-dispatch ke queue'
|
||||
]);
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error('InspeksiController: Gagal menjalankan cleanup manual', [
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString()
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Gagal menjalankan cleanup: ' . $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
172
app/Http/Controllers/JenisLampiranController.php
Normal file
172
app/Http/Controllers/JenisLampiranController.php
Normal file
@@ -0,0 +1,172 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Routing\Controller;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Exports\JenisLampiranExport;
|
||||
use Modules\Lpj\Http\Requests\JenisLampiranRequest;
|
||||
use Modules\Lpj\Models\JenisLampiran;
|
||||
|
||||
class JenisLampiranController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$jenisLampirans = JenisLampiran::all();
|
||||
return view('lpj::jenis_lampiran.index', compact('jenisLampirans'));
|
||||
}
|
||||
|
||||
public function store(JenisLampiranRequest $request)
|
||||
{
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
$validated = $request->validated();
|
||||
$validated['created_by'] = Auth::id();
|
||||
|
||||
$jenisLampiran = JenisLampiran::create($validated);
|
||||
|
||||
DB::commit();
|
||||
return redirect()
|
||||
->route('basicdata.jenis-lampiran.index')
|
||||
->with('success', 'Jenis Lampiran berhasil ditambahkan.');
|
||||
} catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
return redirect()
|
||||
->back()
|
||||
->with('error', 'Gagal menambahkan Jenis Lampiran: ' . $e->getMessage())
|
||||
->withInput();
|
||||
}
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return view('lpj::jenis_lampiran.create');
|
||||
}
|
||||
|
||||
public function show($id)
|
||||
{
|
||||
$jenisLampiran = JenisLampiran::findOrFail($id);
|
||||
return view('lpj::jenis_lampiran.show', compact('jenisLampiran'));
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
$jenisLampiran = JenisLampiran::findOrFail($id);
|
||||
return view('lpj::jenis_lampiran.create', compact('jenisLampiran'));
|
||||
}
|
||||
|
||||
public function update(JenisLampiranRequest $request, $id)
|
||||
{
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
$jenisLampiran = JenisLampiran::findOrFail($id);
|
||||
$validated = $request->validated();
|
||||
$validated['updated_by'] = Auth::id();
|
||||
|
||||
$jenisLampiran->update($validated);
|
||||
|
||||
DB::commit();
|
||||
return redirect()
|
||||
->route('basicdata.jenis-lampiran.index')
|
||||
->with('success', 'Jenis Lampiran berhasil diperbarui.');
|
||||
} catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
return redirect()
|
||||
->back()
|
||||
->with('error', 'Gagal memperbarui Jenis Lampiran: ' . $e->getMessage())
|
||||
->withInput();
|
||||
}
|
||||
}
|
||||
|
||||
public function destroy($id)
|
||||
{
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
$jenisLampiran = JenisLampiran::findOrFail($id);
|
||||
$jenisLampiran->deleted_by = Auth::id();
|
||||
$jenisLampiran->save();
|
||||
|
||||
$jenisLampiran->delete();
|
||||
|
||||
DB::commit();
|
||||
echo json_encode(['success' => true, 'message' => 'Jenis Lampiran berhasil dihapus.']);
|
||||
|
||||
} catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Gagal menghapus Jenis Lampiran: ' . $e->getMessage()
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
// Retrieve data from the database
|
||||
$query = JenisLampiran::query();
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nama', 'LIKE', "%$search%")
|
||||
->orWhere('deskripsi', 'LIKE', "%$search%");
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = $request->get('page', 1);
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function export()
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('jenis_lampiran.export')) {
|
||||
abort(403, 'Sorry! You are not allowed to export jenis lampiran.');
|
||||
}
|
||||
|
||||
return Excel::download(new JenisLampiranExport, 'jenis_lampiran.xlsx');
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Exports\JenisLegalitasJaminanExport;
|
||||
use Modules\Lpj\Http\Requests\JenisLegalitasJaminanRequest;
|
||||
use Modules\Lpj\Models\CustomField;
|
||||
use Modules\Lpj\Models\JenisLegalitasJaminan;
|
||||
|
||||
class JenisLegalitasJaminanController extends Controller
|
||||
@@ -40,13 +41,15 @@
|
||||
|
||||
public function create()
|
||||
{
|
||||
return view('lpj::jenis_legalitas_jaminan.create');
|
||||
$customFields = CustomField::orderBy('urutan_prioritas', 'asc')->get();
|
||||
return view('lpj::jenis_legalitas_jaminan.create',compact('customFields'));
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
$jenisLegalitasJaminan = JenisLegalitasJaminan::find($id);
|
||||
return view('lpj::jenis_legalitas_jaminan.create', compact('jenisLegalitasJaminan'));
|
||||
$customFields = CustomField::orderBy('urutan_prioritas', 'asc')->get();
|
||||
return view('lpj::jenis_legalitas_jaminan.create', compact('jenisLegalitasJaminan', 'customFields'));
|
||||
}
|
||||
|
||||
public function update(JenisLegalitasJaminanRequest $request, $id)
|
||||
@@ -147,4 +150,16 @@
|
||||
{
|
||||
return Excel::download(new JenisLegalitasJaminanExport, 'jenis_legalitas_jaminan.xlsx');
|
||||
}
|
||||
|
||||
public function getCustomFields($id)
|
||||
{
|
||||
$jenisLegalitasJaminan = JenisLegalitasJaminan::findOrFail($id);
|
||||
if(!$jenisLegalitasJaminan->custom_fields) {
|
||||
return response()->json([]);
|
||||
}
|
||||
|
||||
$customFields = CustomField::whereIn('id', $jenisLegalitasJaminan->custom_fields)->get();
|
||||
|
||||
return response()->json($customFields);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,8 +44,13 @@ class KJPPController extends Controller
|
||||
|
||||
// Combine KJPP number with branch code
|
||||
$fullKjppNumber = $kjppNumber;
|
||||
$detailJoinEmailKantor = json_encode([]);
|
||||
$detailJoinPimpinan = json_encode([]);
|
||||
$detailJoinPicReviewer = json_encode([]);
|
||||
$detailJoinPicAdmin = json_encode([]);
|
||||
$detailJoinPicMarketing = json_encode([]);
|
||||
|
||||
return view('lpj::kjpp.create', compact('ijin_usaha', 'jenis_aset', 'provinces', 'fullKjppNumber'));
|
||||
return view('lpj::kjpp.create', compact('ijin_usaha', 'jenis_aset', 'provinces', 'fullKjppNumber', 'detailJoinEmailKantor', 'detailJoinPimpinan', 'detailJoinPicReviewer', 'detailJoinPicAdmin', 'detailJoinPicMarketing'));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -55,8 +60,11 @@ class KJPPController extends Controller
|
||||
{
|
||||
$validated = $request->validated();
|
||||
|
||||
|
||||
if ($validated) {
|
||||
$detailEmailKantor = [];
|
||||
$detailNamaPimpinan = [];
|
||||
$detailNomorPicPimpinan = [];
|
||||
$detailNamaPicReviewer = [];
|
||||
$detailNomorHpPicReviewer = [];
|
||||
$detailNamaPicAdmin = [];
|
||||
@@ -65,6 +73,8 @@ class KJPPController extends Controller
|
||||
$detailNomorHpPicMarketing = [];
|
||||
|
||||
$emailKantor = $request->input('detail_email_kantor.email_kantor', []);
|
||||
$namaPimpinan = $request->input('detail_nama_pimpinan.nama_pimpinan', []);
|
||||
$nomorHpPimpinan = $request->input('detail_nomor_hp_pimpinan.nomor_hp_pimpinan', []);
|
||||
$namaPicReviewer = $request->input('detail_nama_pic_reviewer.nama_pic_reviewer', []);
|
||||
$nomorHpPicReviewer = $request->input('detail_nomor_hp_pic_reviewer.nomor_hp_pic_reviewer', []);
|
||||
$namaPicAdmin = $request->input('detail_nama_pic_admin.nama_pic_admin', []);
|
||||
@@ -73,58 +83,56 @@ class KJPPController extends Controller
|
||||
$nomorHpPicMarketing = $request->input('detail_nomor_hp_pic_marketing.nomor_hp_pic_marketing', []);
|
||||
|
||||
foreach ($emailKantor as $value) {
|
||||
$detailEmailKantor[] = [
|
||||
'email_kantor' => $value
|
||||
];
|
||||
$detailEmailKantor[] = $value;
|
||||
}
|
||||
// Encode to JSON and store
|
||||
$detailEmailKantorJson = json_encode($detailEmailKantor);
|
||||
|
||||
// Process detail_nama_pimpinan
|
||||
foreach ($namaPimpinan as $value) {
|
||||
$detailNamaPimpinan[] = $value;
|
||||
}
|
||||
$detailNamaPimpinanJson = json_encode($detailNamaPimpinan);
|
||||
|
||||
// Process detail_nomor_pic_pimpinan
|
||||
foreach ($nomorHpPimpinan as $value) {
|
||||
$detailNomorPicPimpinan[] = $value;
|
||||
}
|
||||
$detailNomorPicPimpinanJson = json_encode($detailNomorPicPimpinan);
|
||||
|
||||
// Process detail_nama_pic_reviewer
|
||||
foreach ($namaPicReviewer as $value) {
|
||||
$detailNamaPicReviewer[] = [
|
||||
'nama_pic_reviewer' => $value
|
||||
];
|
||||
$detailNamaPicReviewer[] = $value;
|
||||
}
|
||||
$detailNamaPicReviewerJson = json_encode($detailNamaPicReviewer);
|
||||
|
||||
// Process detail_nomor_hp_pic_reviewer
|
||||
foreach ($nomorHpPicReviewer as $value) {
|
||||
$detailNomorHpPicReviewer[] = [
|
||||
'nomor_hp_pic_reviewer' => $value
|
||||
];
|
||||
$detailNomorHpPicReviewer[] = $value;
|
||||
}
|
||||
$detailNomorHpPicReviewerJson = json_encode($detailNomorHpPicReviewer);
|
||||
|
||||
// Process detail_nama_pic_admin
|
||||
foreach ($namaPicAdmin as $value) {
|
||||
$detailNamaPicAdmin[] = [
|
||||
'nama_pic_admin' => $value
|
||||
];
|
||||
$detailNamaPicAdmin[] = $value;
|
||||
}
|
||||
$detailNamaPicAdminJson = json_encode($detailNamaPicAdmin);
|
||||
|
||||
// Process detail_nomor_hp_pic_admin
|
||||
foreach ($nomorHpPicAdmin as $value) {
|
||||
$detailNomorHpPicAdmin[] = [
|
||||
'nomor_hp_pic_admin' => $value
|
||||
];
|
||||
$detailNomorHpPicAdmin[] = $value;
|
||||
}
|
||||
$detailNomorHpPicAdminJson = json_encode($detailNomorHpPicAdmin);
|
||||
|
||||
// Process detail_nama_pic_marketing
|
||||
foreach ($namaPicMarketing as $value) {
|
||||
$detailNamaPicMarketing[] = [
|
||||
'nama_pic_marketing' => $value
|
||||
];
|
||||
$detailNamaPicMarketing[] = $value;
|
||||
}
|
||||
$detailNamaPicMarketingJson = json_encode($detailNamaPicMarketing);
|
||||
|
||||
// Process detail_nomor_hp_pic_marketing
|
||||
foreach ($nomorHpPicMarketing as $value) {
|
||||
$detailNomorHpPicMarketing[] = [
|
||||
'nomor_hp_pic_marketing' => $value
|
||||
];
|
||||
$detailNomorHpPicMarketing[] = $value;
|
||||
}
|
||||
$detailNomorHpPicMarketingJson = json_encode($detailNomorHpPicMarketing);
|
||||
|
||||
@@ -141,6 +149,8 @@ class KJPPController extends Controller
|
||||
}
|
||||
|
||||
$validated['detail_email_kantor'] = $detailEmailKantorJson;
|
||||
$validated['detail_nama_pimpinan'] = $detailNamaPimpinanJson;
|
||||
$validated['detail_nomor_hp_pimpinan'] = $detailNomorPicPimpinanJson;
|
||||
$validated['detail_nama_pic_reviewer'] = $detailNamaPicReviewerJson;
|
||||
$validated['detail_nomor_hp_pic_reviewer'] = $detailNomorHpPicReviewerJson;
|
||||
$validated['detail_nama_pic_admin'] = $detailNamaPicAdminJson;
|
||||
@@ -148,7 +158,11 @@ class KJPPController extends Controller
|
||||
$validated['detail_nama_pic_marketing'] = $detailNamaPicMarketingJson;
|
||||
$validated['detail_nomor_hp_pic_marketing'] = $detailNomorHpPicMarketingJson;
|
||||
$validated['ijin_usaha_id'] = json_encode($validated['ijin_usaha_id']);
|
||||
$validated['jenis_aset_id'] = json_encode($validated['jenis_aset_id']);
|
||||
if (empty($validated['jenis_aset_id'])) {
|
||||
$validated['jenis_aset_id'] = json_encode([]);
|
||||
} else {
|
||||
$validated['jenis_aset_id'] = json_encode($validated['jenis_aset_id']);
|
||||
}
|
||||
// Tambahkan nama file ke data yang divalidasi
|
||||
$validated['attachment'] = $filename;
|
||||
|
||||
@@ -181,6 +195,8 @@ class KJPPController extends Controller
|
||||
$districts = District::where('code', $kjpp->district_code)->get();
|
||||
$villages = Village::where('code', $kjpp->village_code)->get();
|
||||
$detailEmailKantor = json_decode($kjpp->detail_email_kantor);
|
||||
$detailNamaPimpinan = json_decode($kjpp->detail_nama_pimpinan);
|
||||
$detailNomorHpPimpinan = json_decode($kjpp->detail_nomor_hp_pimpinan);
|
||||
$detailNamaPicReviewer = json_decode($kjpp->detail_nama_pic_reviewer);
|
||||
$detailNomorHpPicReviewer = json_decode($kjpp->detail_nomor_hp_pic_reviewer);
|
||||
$detailNamaPicAdmin = json_decode($kjpp->detail_nama_pic_admin);
|
||||
@@ -188,28 +204,42 @@ class KJPPController extends Controller
|
||||
$detailNamaPicMarketing = json_decode($kjpp->detail_nama_pic_marketing);
|
||||
$detailNomorHpPicMarketing = json_decode($kjpp->detail_nomor_hp_pic_marketing);
|
||||
|
||||
$detailJoinEmailKantor = json_encode(array_map(function ($email) {
|
||||
return [
|
||||
'email_kantor' => $email
|
||||
];
|
||||
}, $detailEmailKantor));
|
||||
|
||||
$detailJoinPimpinan = json_encode(array_map(function ($nama, $nomor) {
|
||||
return [
|
||||
'nama_pimpinan' => $nama,
|
||||
'nomor_hp_pimpinan' => $nomor
|
||||
];
|
||||
}, $detailNamaPimpinan, $detailNomorHpPimpinan));
|
||||
|
||||
|
||||
$detailJoinPicReviewer = json_encode(array_map(function ($nama, $nomor) {
|
||||
return [
|
||||
'nama_pic_reviewer' => $nama->nama_pic_reviewer,
|
||||
'nomor_hp_pic_reviewer' => $nomor->nomor_hp_pic_reviewer
|
||||
'nama_pic_reviewer' => $nama,
|
||||
'nomor_hp_pic_reviewer' => $nomor
|
||||
];
|
||||
}, $detailNamaPicReviewer, $detailNomorHpPicReviewer));
|
||||
|
||||
$detailJoinPicAdmin = json_encode(array_map(function ($nama, $nomor) {
|
||||
return [
|
||||
'nama_pic_admin' => $nama->nama_pic_admin,
|
||||
'nomor_hp_pic_admin' => $nomor->nomor_hp_pic_admin
|
||||
'nama_pic_admin' => $nama,
|
||||
'nomor_hp_pic_admin' => $nomor
|
||||
];
|
||||
}, $detailNamaPicAdmin, $detailNomorHpPicAdmin));
|
||||
|
||||
$detailJoinPicMarketing = json_encode(array_map(function ($nama, $nomor) {
|
||||
return [
|
||||
'nama_pic_marketing' => $nama->nama_pic_marketing,
|
||||
'nomor_hp_pic_marketing' => $nomor->nomor_hp_pic_marketing
|
||||
'nama_pic_marketing' => $nama,
|
||||
'nomor_hp_pic_marketing' => $nomor
|
||||
];
|
||||
}, $detailNamaPicMarketing, $detailNomorHpPicMarketing));
|
||||
|
||||
return view('lpj::kjpp.show', compact('jenis_jaminan', 'ijin_usahas', 'ijin_usaha', 'kjpp', 'provinces', 'cities', 'districts', 'villages', 'detailEmailKantor', 'detailJoinPicReviewer', 'detailJoinPicAdmin', 'detailJoinPicMarketing'));
|
||||
return view('lpj::kjpp.show', compact('jenis_jaminan', 'ijin_usahas', 'ijin_usaha', 'kjpp', 'provinces', 'cities', 'districts', 'villages', 'detailJoinEmailKantor', 'detailJoinPicReviewer', 'detailJoinPicAdmin', 'detailJoinPicMarketing', 'detailJoinPimpinan'));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -225,6 +255,8 @@ class KJPPController extends Controller
|
||||
$districts = District::where('city_code', $kjpp->city_code)->get();
|
||||
$villages = Village::where('district_code', $kjpp->district_code)->get();
|
||||
$detailEmailKantor = json_decode($kjpp->detail_email_kantor);
|
||||
$detailNamaPimpinan = json_decode($kjpp->detail_nama_pimpinan);
|
||||
$detailNomorHpPimpinan = json_decode($kjpp->detail_nomor_hp_pimpinan);
|
||||
$detailNamaPicReviewer = json_decode($kjpp->detail_nama_pic_reviewer);
|
||||
$detailNomorHpPicReviewer = json_decode($kjpp->detail_nomor_hp_pic_reviewer);
|
||||
$detailNamaPicAdmin = json_decode($kjpp->detail_nama_pic_admin);
|
||||
@@ -232,28 +264,42 @@ class KJPPController extends Controller
|
||||
$detailNamaPicMarketing = json_decode($kjpp->detail_nama_pic_marketing);
|
||||
$detailNomorHpPicMarketing = json_decode($kjpp->detail_nomor_hp_pic_marketing);
|
||||
|
||||
$detailJoinEmailKantor = json_encode(array_map(function ($email) {
|
||||
return [
|
||||
'email_kantor' => $email
|
||||
];
|
||||
}, $detailEmailKantor));
|
||||
|
||||
$detailJoinPimpinan = json_encode(array_map(function ($nama, $nomor) {
|
||||
return [
|
||||
'nama_pimpinan' => $nama,
|
||||
'nomor_hp_pimpinan' => $nomor
|
||||
];
|
||||
}, $detailNamaPimpinan, $detailNomorHpPimpinan));
|
||||
|
||||
|
||||
$detailJoinPicReviewer = json_encode(array_map(function ($nama, $nomor) {
|
||||
return [
|
||||
'nama_pic_reviewer' => $nama->nama_pic_reviewer,
|
||||
'nomor_hp_pic_reviewer' => $nomor->nomor_hp_pic_reviewer
|
||||
'nama_pic_reviewer' => $nama,
|
||||
'nomor_hp_pic_reviewer' => $nomor
|
||||
];
|
||||
}, $detailNamaPicReviewer, $detailNomorHpPicReviewer));
|
||||
|
||||
$detailJoinPicAdmin = json_encode(array_map(function ($nama, $nomor) {
|
||||
return [
|
||||
'nama_pic_admin' => $nama->nama_pic_admin,
|
||||
'nomor_hp_pic_admin' => $nomor->nomor_hp_pic_admin
|
||||
'nama_pic_admin' => $nama,
|
||||
'nomor_hp_pic_admin' => $nomor
|
||||
];
|
||||
}, $detailNamaPicAdmin, $detailNomorHpPicAdmin));
|
||||
|
||||
$detailJoinPicMarketing = json_encode(array_map(function ($nama, $nomor) {
|
||||
return [
|
||||
'nama_pic_marketing' => $nama->nama_pic_marketing,
|
||||
'nomor_hp_pic_marketing' => $nomor->nomor_hp_pic_marketing
|
||||
'nama_pic_marketing' => $nama,
|
||||
'nomor_hp_pic_marketing' => $nomor
|
||||
];
|
||||
}, $detailNamaPicMarketing, $detailNomorHpPicMarketing));
|
||||
|
||||
return view('lpj::kjpp.create', compact('kjpp', 'ijin_usaha', 'jenis_aset', 'provinces', 'cities', 'districts', 'villages', 'detailJoinPicReviewer', 'detailJoinPicAdmin', 'detailJoinPicMarketing', 'detailEmailKantor'));
|
||||
return view('lpj::kjpp.create', compact('kjpp', 'ijin_usaha', 'jenis_aset', 'provinces', 'cities', 'districts', 'villages', 'detailJoinPicReviewer', 'detailJoinPicAdmin', 'detailJoinPicMarketing', 'detailJoinEmailKantor', 'detailJoinPimpinan'));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -267,6 +313,8 @@ class KJPPController extends Controller
|
||||
|
||||
if ($validated) {
|
||||
$detailEmailKantor = [];
|
||||
$detailNamaPimpinan = [];
|
||||
$detailNomorHpPimpinan = [];
|
||||
$detailNamaPicReviewer = [];
|
||||
$detailNomorHpPicReviewer = [];
|
||||
$detailNamaPicAdmin = [];
|
||||
@@ -275,6 +323,8 @@ class KJPPController extends Controller
|
||||
$detailNomorHpPicMarketing = [];
|
||||
|
||||
$emailKantor = $request->input('detail_email_kantor.email_kantor', []);
|
||||
$namaPimpinan = $request->input('detail_nama_pimpinan.nama_pimpinan', []);
|
||||
$nomorHpPimpinan = $request->input('detail_nomor_hp_pimpinan.nomor_hp_pimpinan', []);
|
||||
$namaPicReviewer = $request->input('detail_nama_pic_reviewer.nama_pic_reviewer', []);
|
||||
$nomorHpPicReviewer = $request->input('detail_nomor_hp_pic_reviewer.nomor_hp_pic_reviewer', []);
|
||||
$namaPicAdmin = $request->input('detail_nama_pic_admin.nama_pic_admin', []);
|
||||
@@ -283,58 +333,56 @@ class KJPPController extends Controller
|
||||
$nomorHpPicMarketing = $request->input('detail_nomor_hp_pic_marketing.nomor_hp_pic_marketing', []);
|
||||
|
||||
foreach ($emailKantor as $value) {
|
||||
$detailEmailKantor[] = [
|
||||
'email_kantor' => $value
|
||||
];
|
||||
$detailEmailKantor[] = $value;
|
||||
}
|
||||
// Encode to JSON and store
|
||||
$detailEmailKantorJson = json_encode($detailEmailKantor);
|
||||
|
||||
// Process detail_nama_pimpinan
|
||||
foreach ($namaPimpinan as $value) {
|
||||
$detailNamaPimpinan[] = $value;
|
||||
}
|
||||
$detailNamaPimpinanJson = json_encode($detailNamaPimpinan);
|
||||
|
||||
// Process detail_nomor_hp_pimpinan
|
||||
foreach ($nomorHpPimpinan as $value) {
|
||||
$detailNomorHpPimpinan[] = $value;
|
||||
}
|
||||
$detailNomorHpPimpinanJson = json_encode($detailNomorHpPimpinan);
|
||||
|
||||
// Process detail_nama_pic_reviewer
|
||||
foreach ($namaPicReviewer as $value) {
|
||||
$detailNamaPicReviewer[] = [
|
||||
'nama_pic_reviewer' => $value
|
||||
];
|
||||
$detailNamaPicReviewer[] = $value;
|
||||
}
|
||||
$detailNamaPicReviewerJson = json_encode($detailNamaPicReviewer);
|
||||
|
||||
// Process detail_nomor_hp_pic_reviewer
|
||||
foreach ($nomorHpPicReviewer as $value) {
|
||||
$detailNomorHpPicReviewer[] = [
|
||||
'nomor_hp_pic_reviewer' => $value
|
||||
];
|
||||
$detailNomorHpPicReviewer[] = $value;
|
||||
}
|
||||
$detailNomorHpPicReviewerJson = json_encode($detailNomorHpPicReviewer);
|
||||
|
||||
// Process detail_nama_pic_admin
|
||||
foreach ($namaPicAdmin as $value) {
|
||||
$detailNamaPicAdmin[] = [
|
||||
'nama_pic_admin' => $value
|
||||
];
|
||||
$detailNamaPicAdmin[] = $value;
|
||||
}
|
||||
$detailNamaPicAdminJson = json_encode($detailNamaPicAdmin);
|
||||
|
||||
// Process detail_nomor_hp_pic_admin
|
||||
foreach ($nomorHpPicAdmin as $value) {
|
||||
$detailNomorHpPicAdmin[] = [
|
||||
'nomor_hp_pic_admin' => $value
|
||||
];
|
||||
$detailNomorHpPicAdmin[] = $value;
|
||||
}
|
||||
$detailNomorHpPicAdminJson = json_encode($detailNomorHpPicAdmin);
|
||||
|
||||
// Process detail_nama_pic_marketing
|
||||
foreach ($namaPicMarketing as $value) {
|
||||
$detailNamaPicMarketing[] = [
|
||||
'nama_pic_marketing' => $value
|
||||
];
|
||||
$detailNamaPicMarketing[] = $value;
|
||||
}
|
||||
$detailNamaPicMarketingJson = json_encode($detailNamaPicMarketing);
|
||||
|
||||
// Process detail_nomor_hp_pic_marketing
|
||||
foreach ($nomorHpPicMarketing as $value) {
|
||||
$detailNomorHpPicMarketing[] = [
|
||||
'nomor_hp_pic_marketing' => $value
|
||||
];
|
||||
$detailNomorHpPicMarketing[] = $value;
|
||||
}
|
||||
$detailNomorHpPicMarketingJson = json_encode($detailNomorHpPicMarketing);
|
||||
|
||||
@@ -359,6 +407,8 @@ class KJPPController extends Controller
|
||||
}
|
||||
|
||||
$validated['detail_email_kantor'] = $detailEmailKantorJson;
|
||||
$validated['detail_nama_pimpinan'] = $detailNamaPimpinanJson;
|
||||
$validated['detail_nomor_hp_pimpinan'] = $detailNomorHpPimpinanJson;
|
||||
$validated['detail_nama_pic_reviewer'] = $detailNamaPicReviewerJson;
|
||||
$validated['detail_nomor_hp_pic_reviewer'] = $detailNomorHpPicReviewerJson;
|
||||
$validated['detail_nama_pic_admin'] = $detailNamaPicAdminJson;
|
||||
@@ -366,8 +416,11 @@ class KJPPController extends Controller
|
||||
$validated['detail_nama_pic_marketing'] = $detailNamaPicMarketingJson;
|
||||
$validated['detail_nomor_hp_pic_marketing'] = $detailNomorHpPicMarketingJson;
|
||||
$validated['ijin_usaha_id'] = json_encode($validated['ijin_usaha_id']);
|
||||
$validated['jenis_aset_id'] = json_encode($validated['jenis_aset_id']);
|
||||
|
||||
if (empty($validated['jenis_aset_id'])) {
|
||||
$validated['jenis_aset_id'] = json_encode([]);
|
||||
} else {
|
||||
$validated['jenis_aset_id'] = json_encode($validated['jenis_aset_id']);
|
||||
}
|
||||
// Perbarui data di database
|
||||
KJPP::where('id', $id)->update($validated);
|
||||
|
||||
@@ -409,8 +462,8 @@ class KJPPController extends Controller
|
||||
//abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = KJPP::query();
|
||||
// Retrieve data from the database order by code ascending
|
||||
$query = KJPP::query()->orderBy('code', 'asc');
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
@@ -445,7 +498,7 @@ class KJPPController extends Controller
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->get();
|
||||
$data = $query->with('city')->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
45
app/Http/Controllers/LampiranDokumenController.php
Normal file
45
app/Http/Controllers/LampiranDokumenController.php
Normal file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Modules\Lpj\Models\LampiranDokumen;
|
||||
|
||||
class LampiranDokumenController extends Controller
|
||||
{
|
||||
public function download($id)
|
||||
{
|
||||
$lampiran = LampiranDokumen::findOrFail($id);
|
||||
return Storage::download($lampiran->path_file, $lampiran->nama_file);
|
||||
}
|
||||
|
||||
public function upload(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'permohonan_id' => 'required|exists:permohonan,id',
|
||||
'jenis_lampiran_id' => 'required|exists:jenis_lampiran,id',
|
||||
'nama_file' => 'nullable|string|max:255',
|
||||
'file' => 'required|file|max:10240',
|
||||
'keterangan' => 'nullable|string|max:255',
|
||||
]);
|
||||
|
||||
$lampiran = LampiranDokumen::uploadLampiran($request->all());
|
||||
|
||||
if ($lampiran) {
|
||||
return redirect()->back()->with('success', 'Lampiran uploaded successfully');
|
||||
} else {
|
||||
return redirect()->back()->with('error', 'Unauthorized or upload failed');
|
||||
}
|
||||
}
|
||||
|
||||
public function delete(LampiranDokumen $lampiran)
|
||||
{
|
||||
if ($lampiran->deleteLampiran()) {
|
||||
return redirect()->back()->with('success', 'Lampiran deleted successfully');
|
||||
} else {
|
||||
return redirect()->back()->with('error', 'Unauthorized or delete failed');
|
||||
}
|
||||
}
|
||||
}
|
||||
185
app/Http/Controllers/LaporanAdminKreditController.php
Normal file
185
app/Http/Controllers/LaporanAdminKreditController.php
Normal file
@@ -0,0 +1,185 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Exports\LaporanAdminKreditExport;
|
||||
use Modules\Lpj\Models\LaporanAdminKredit;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
|
||||
class LaporanAdminKreditController extends Controller
|
||||
{
|
||||
public $user;
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$permohonan = Permohonan::where(['status' => 'done'])->get();
|
||||
foreach ($permohonan as $_permohonan) {
|
||||
$npw = 0;
|
||||
if (isset($_permohonan->penilai->lpj)) {
|
||||
$npw = json_decode($_permohonan->penilai->lpj, true);
|
||||
$npw = $npw['total_nilai_pasar_wajar'] ?? 0;
|
||||
}
|
||||
|
||||
$dataAdk = [
|
||||
'jenis_agunan' => $_permohonan->documents->pluck('jenisJaminan.name')->unique()->implode(', '),
|
||||
'alamat_agunan' => $_permohonan->documents->map(function ($document) {
|
||||
return formatAlamat($document);
|
||||
})->unique()->implode(', '),
|
||||
'nama_pemilik' => $_permohonan->documents->pluck('pemilik.name')->unique()->implode(', '),
|
||||
'tanggal_kunjungan' => $_permohonan->penilaian->tanggal_kunjungan,
|
||||
'nama_penilai' => $_permohonan->penilaian->_user_penilai->userPenilaiTeam->name,
|
||||
'nilai_likuidasi' => $_permohonan->nilai_liquidasi,
|
||||
'nilai_pasar_wajar' => str_replace('.', '', $npw),
|
||||
'bukti_kepemilikan' => $_permohonan->documents->flatMap(function ($document) {
|
||||
return $document->detail->map(function ($detail) {
|
||||
return (!empty($detail->dokumen_nomor) && is_array($detail->dokumen_nomor))
|
||||
? ($detail->jenisLegalitasJaminan->name ?? '') . "\n" . implode(', ', $detail->dokumen_nomor)
|
||||
: null;
|
||||
});
|
||||
})->filter()->unique()->implode(', '),
|
||||
];
|
||||
|
||||
LaporanAdminKredit::updateOrCreate([
|
||||
'debiture_id' => $_permohonan->debiture_id,
|
||||
], $dataAdk);
|
||||
}
|
||||
|
||||
|
||||
$laporans = LaporanAdminKredit::with('debiture')->paginate(10);
|
||||
return view('lpj::laporan_admin_kredit.index', compact('laporans'));
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('laporan-admin-kredit.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view laporan admin kredit.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = LaporanAdminKredit::query();
|
||||
|
||||
if ($request->has('tanggal_awal') && $request->has('tanggal_akhir')) {
|
||||
$query->whereBetween('tanggal_kunjungan', [$request->tanggal_awal, $request->tanggal_akhir]);
|
||||
}
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$search_ = json_decode($search);
|
||||
|
||||
if (isset($search_->search)) {
|
||||
$query->where(function ($q) use ($search_) {
|
||||
$q->where('kode_register_t24', 'LIKE', '%' . $search_->search . '%')
|
||||
->orWhere('jenis_agunan', 'LIKE', '%' . $search_->search . '%')
|
||||
->orWhere('nama_pemilik', 'LIKE', '%' . $search_->search . '%')
|
||||
->orWhereHas('debiture', function ($query) use ($search_) {
|
||||
$query->where('name', 'LIKE', '%' . $search_->search . '%');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if (isset($search_->tanggal_awal) && isset($search_->tanggal_akhir)) {
|
||||
$query->whereBetween('tanggal_kunjungan', [$search_->tanggal_awal, $search_->tanggal_akhir]);
|
||||
}
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->with(['debiture.branch'])->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = $request->get('page', 1);
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function export()
|
||||
{
|
||||
return Excel::download(new LaporanAdminKreditExport, 'laporan_admin_kredit.xlsx');
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
$laporanAdminKredit = LaporanAdminKredit::with('debiture.branch')->find($id);
|
||||
return view('lpj::laporan_admin_kredit.form', compact('laporanAdminKredit'));
|
||||
}
|
||||
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$request->validate([
|
||||
'kode_register_t24' => 'nullable',
|
||||
'cif' => 'required',
|
||||
'keterangan' => 'nullable|string',
|
||||
'kolektibilitas' => 'nullable|string|in:1,2,3,4,5',
|
||||
]);
|
||||
|
||||
try {
|
||||
$laporanAdminKredit = LaporanAdminKredit::find($id);
|
||||
|
||||
// Update only the editable fields
|
||||
$laporanAdminKredit->update([
|
||||
'kode_register_t24' => $request->kode_register_t24,
|
||||
'keterangan' => $request->keterangan,
|
||||
'kolektibilitas' => $request->kolektibilitas,
|
||||
'updated_by' => Auth::id(),
|
||||
]);
|
||||
|
||||
// Update CIF in the debiture table if needed
|
||||
if ($laporanAdminKredit->debiture) {
|
||||
$laporanAdminKredit->debiture->update([
|
||||
'cif' => $request->cif,
|
||||
'updated_by' => Auth::id(),
|
||||
]);
|
||||
}
|
||||
|
||||
return redirect()
|
||||
->route('admin-kredit.laporan.index')
|
||||
->with('success', 'Laporan Admin Kredit updated successfully');
|
||||
} catch (Exception $e) {
|
||||
return redirect()
|
||||
->route('admin-kredit.laporan.edit', $id)
|
||||
->with('error', 'Failed to update Laporan Admin Kredit');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class LaporanBiayaInternalExternalController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function showLaporanBiayaInternal()
|
||||
{
|
||||
return view('lpj::laporan-biaya.internal');
|
||||
}
|
||||
|
||||
public function showLaporanBiayaExternal()
|
||||
{
|
||||
return view('lpj::laporan-biaya.external');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,15 +2,29 @@
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Modules\Lpj\Http\Controllers\PenilaiController;
|
||||
|
||||
class LaporanController extends Controller
|
||||
{
|
||||
public $user;
|
||||
public $penilaiController;
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
|
||||
public function __construct(PenilaiController $penilaiController){
|
||||
$this->penilaiController = $penilaiController;
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
return view('lpj::laporan.index');
|
||||
}
|
||||
|
||||
public function sederhana_index()
|
||||
{
|
||||
return view('lpj::laporan.sederhana_index');
|
||||
@@ -24,11 +38,109 @@ class LaporanController extends Controller
|
||||
/**
|
||||
* Show the specified resource.
|
||||
*/
|
||||
public function show($id) {}
|
||||
public function show($id) {
|
||||
$permohonan = Permohonan::with([
|
||||
'penilai',
|
||||
'dokumenjaminan',
|
||||
])->find($id);
|
||||
|
||||
if ($permohonan->penilai->type_penilai == 'memo') {
|
||||
return $this->penilaiController->print_out($request = new Request(['documentId' => $permohonan->penilai->dokument_id, 'jaminanId' => $permohonan->dokumenjaminan[0]->jenis_jaminan_id, 'permohonanId' => $permohonan->id, 'statusLpj' => 1, 'type' => 'memo']));
|
||||
}
|
||||
|
||||
if ($permohonan->penilai->type_penilai == 'rap') {
|
||||
return $this->penilaiController->print_out($request = new Request(['documentId' => $permohonan->penilai->dokument_id, 'jaminanId' => $permohonan->dokumenjaminan[0]->jenis_jaminan_id, 'permohonanId' => $permohonan->id, 'statusLpj' => 1, 'type' => 'rap']));
|
||||
}
|
||||
|
||||
return view('lpj::laporan.show', compact('permohonan'));
|
||||
}
|
||||
/**
|
||||
* Store form inspeksi.
|
||||
*/
|
||||
public function store(Request $request) {}
|
||||
public function store(Request $request) {
|
||||
$permohonan = Permohonan::find($request->permohonan_id);
|
||||
if($request->nilai_liquidasi) {
|
||||
$permohonan->nilai_liquidasi = $request->liquidasi;
|
||||
$permohonan->save();
|
||||
return redirect()->route('laporan.index')->with('success', 'Nilai Liquidasi updated successfully');
|
||||
}
|
||||
}
|
||||
|
||||
public function update(Request $request, $id) {}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = Permohonan::query()
|
||||
->whereIn('status',['proses-laporan','done', 'paparan', 'proses-paparan']);
|
||||
|
||||
if (Auth::user()->hasAnyRole(['pemohon-ao','pemohon-eo'])) {
|
||||
$query = $query->where('branch_id', Auth::user()->branch_id);
|
||||
}
|
||||
|
||||
$query = $query->orderBy('nomor_registrasi', 'desc');
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
$size = $request->get('size', 10);
|
||||
if ($size == 0) {
|
||||
$size = 10;
|
||||
}
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian','jenisFasilitasKredit', 'documents.inspeksi','penilai','documents.detail','noc'])->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $size);
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = max(1, $request->get('page', 1));
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
33
app/Http/Controllers/LaporanDebitureController.php
Normal file
33
app/Http/Controllers/LaporanDebitureController.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Models\Debiture;
|
||||
use Modules\Lpj\Services\LaporanDebitureService;
|
||||
|
||||
class LaporanDebitureController extends Controller
|
||||
{
|
||||
private $laporanDebitureService;
|
||||
public function __construct()
|
||||
{
|
||||
$this->laporanDebitureService = app(LaporanDebitureService::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$debiture = Debiture::all();
|
||||
return view('lpj::laporan-debiture.index', compact('debiture'));
|
||||
}
|
||||
|
||||
|
||||
public function dataTableForDebiture(Request $request)
|
||||
{
|
||||
return $this->laporanDebitureService->dataForDatatables($request);
|
||||
}
|
||||
|
||||
}
|
||||
173
app/Http/Controllers/LaporanExternalController.php
Normal file
173
app/Http/Controllers/LaporanExternalController.php
Normal file
@@ -0,0 +1,173 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Models\LaporanExternal;
|
||||
use Modules\Lpj\Http\Requests\LaporanExternalRequest;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
|
||||
class LaporanExternalController extends Controller
|
||||
{
|
||||
public $user;
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$laporanExternals = LaporanExternal::with('permohonan')->paginate(10);
|
||||
return view('lpj::laporan_external.index', compact('laporanExternals'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
return view('lpj::laporan_external.create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(LaporanExternalRequest $request)
|
||||
{
|
||||
$validatedData = $request->validated();
|
||||
|
||||
if ($request->hasFile('file_resume')) {
|
||||
$validatedData['file_resume'] = $request->file('file_resume')->store('laporan_external/resume', 'public');
|
||||
}
|
||||
|
||||
if ($request->hasFile('file_laporan')) {
|
||||
$validatedData['file_laporan'] = $request->file('file_laporan')->store('laporan_external/laporan', 'public');
|
||||
}
|
||||
|
||||
LaporanExternal::create($validatedData);
|
||||
|
||||
return redirect()->route('laporan-external.index')->with('success', 'Laporan External berhasil ditambahkan.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the specified resource.
|
||||
*/
|
||||
public function show(LaporanExternal $laporanExternal)
|
||||
{
|
||||
return view('lpj::laporan_external.show', compact('laporanExternal'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit(LaporanExternal $laporanExternal)
|
||||
{
|
||||
$permohonan = Permohonan::find($laporanExternal->permohonan_id);
|
||||
return view('lpj::laporan_external.create', compact('laporanExternal','permohonan'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(LaporanExternalRequest $request, LaporanExternal $laporanExternal)
|
||||
{
|
||||
$validatedData = $request->validated();
|
||||
|
||||
if ($request->hasFile('file_resume')) {
|
||||
$validatedData['file_resume'] = $request->file('file_resume')->store('laporan_external/resume', 'public');
|
||||
}
|
||||
|
||||
if ($request->hasFile('file_laporan')) {
|
||||
$validatedData['file_laporan'] = $request->file('file_laporan')->store('laporan_external/laporan', 'public');
|
||||
}
|
||||
|
||||
$laporanExternal->update($validatedData);
|
||||
|
||||
return redirect()->route('laporan-external.index')->with('success', 'Laporan External berhasil diperbarui.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(LaporanExternal $laporanExternal)
|
||||
{
|
||||
$laporanExternal->delete();
|
||||
|
||||
return redirect()->route('laporan-external.index')->with('success', 'Laporan External berhasil dihapus.');
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('jenis_aset.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = LaporanExternal::query();
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_laporan', 'LIKE', "%$search%")
|
||||
->orWhere('tanggal_laporan', 'LIKE', "%$search%")
|
||||
->orWhereHas('permohonan', function($q) use ($search) {
|
||||
$q->where('nomor_permohonan', 'LIKE', "%$search%");
|
||||
})
|
||||
->orWhere('tgl_final_laporan', 'LIKE', "%$search%")
|
||||
->orWhere('nilai_pasar', 'LIKE', "%$search%")
|
||||
->orWhere('indikasi_nilai_likuidasi', 'LIKE', "%$search%")
|
||||
->orWhere('indikasi_nilai_pasar_tanah', 'LIKE', "%$search%")
|
||||
->orWhere('estimasi_harga_tanah', 'LIKE', "%$search%")
|
||||
->orWhere('estimasi_harga_bangunan', 'LIKE', "%$search%")
|
||||
->orWhere('indikasi_nilai_pasar_bangunan', 'LIKE', "%$search%")
|
||||
->orWhere('indikasi_nilai_pasar_sarana_pelengkap', 'LIKE', "%$search%")
|
||||
->orWhere('indikasi_nilai_pasar_mesin', 'LIKE', "%$search%")
|
||||
->orWhere('indikasi_nilai_pasar_kendaraan_alat_berat', 'LIKE', "%$search%")
|
||||
->orWhere('file_resume', 'LIKE', "%$search%")
|
||||
->orWhere('file_laporan', 'LIKE', "%$search%");
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->with(['permohonan.debiture','permohonan.penawaran.tujuanPenilaianKjpp','permohonan.dokumenjaminan.jenisjaminan'])->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = 0 + 1;
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,213 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Exports\LaporanHasilPenilaianJaminanInternalExternalExport;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
|
||||
class LaporanHasilPenilaianJaminanInternalExternalController extends Controller
|
||||
{
|
||||
public $user;
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('lpj::laporan_hasil_penilaian_jaminan_internal_external.index');
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('laporan-admin-kredit.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view laporan admin kredit.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = Permohonan::query();
|
||||
$query = $query->where('status', 'done');
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = json_decode($request->get('search'));
|
||||
|
||||
if (isset($search->start_date) || isset($search->end_date)) {
|
||||
$query->whereBetween('tanggal_permohonan', [
|
||||
$search->start_date ?? '1900-01-01',
|
||||
$search->end_date ?? now()->toDateString()
|
||||
]);
|
||||
}
|
||||
|
||||
// Filter by branch if provided
|
||||
if (isset($search->branch_id) && !empty($search->branch_id)) {
|
||||
$query->where('branch_id', $search->branch_id);
|
||||
}
|
||||
|
||||
if (isset($search->penilai_id) && !empty($search->penilai_id)) {
|
||||
$query->whereHas('penilaian._user_penilai.userPenilaiTeam', function ($q) use ($search) {
|
||||
$q->where('user_id', $search->penilai_id);
|
||||
});
|
||||
}
|
||||
|
||||
if (isset($search->search)) {
|
||||
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('debiture', DB::raw('LOWER(name)'), 'LIKE', '%' . strtolower($search->search) . '%');
|
||||
$q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search->search . '%');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->with(['debiture.branch'])->get();
|
||||
|
||||
$data = $data->map(function ($permohonan) {
|
||||
$luas_tanah = 0;
|
||||
$luas_bangunan = 0;
|
||||
$nilai_tanah = 0;
|
||||
$nilai_bangunan = 0;
|
||||
$npw = 0;
|
||||
$nilai_liquidasi = 0;
|
||||
|
||||
if (isset($permohonan->penilai->lpj)) {
|
||||
$lpj = json_decode($permohonan->penilai->lpj, true);
|
||||
$npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0);
|
||||
|
||||
$luas_tanah = $lpj['luas_tanah'] ?? 0;
|
||||
$luas_bangunan = $lpj['luas_bangunan'] ?? 0;
|
||||
// Calculate nilai_tanah dynamically by looking for all keys that start with 'nilai_tanah_'
|
||||
$nilai_tanah = str_replace('.', '', $lpj['nilai_tanah_2'] ?? 0);
|
||||
|
||||
$nilai_bangunan = str_replace('.', '', $lpj['nilai_bangunan_2'] ?? 0);
|
||||
$nilai_liquidasi = str_replace('.', '', $lpj['likuidasi_nilai_2'] ?? 0);
|
||||
}
|
||||
|
||||
return [
|
||||
'id' => $permohonan->id,
|
||||
'nomor_registrasi' => $permohonan->nomor_registrasi,
|
||||
'jenis_penilaian' => $permohonan->jenisPenilaian?->name,
|
||||
'tujuan_penilaian' => $permohonan->tujuanPenilaian?->name,
|
||||
'jenis_fasilitas_kredit' => $permohonan->jenisFasilitasKredit?->name,
|
||||
'branch' => $permohonan->debiture->branch?->name,
|
||||
'pemohon' => $permohonan->creator?->name,
|
||||
'cif' => $permohonan->debiture->cif,
|
||||
'name' => $permohonan->debiture?->name,
|
||||
'jenis_agunan' => $permohonan->documents?->pluck('jenisJaminan.name')
|
||||
->unique()
|
||||
->implode(', '),
|
||||
'alamat_agunan' => $permohonan->documents?->map(function ($document) {
|
||||
return formatAlamat($document);
|
||||
})->unique()->implode(', '),
|
||||
'bukti_kepemilikan' => (function() use ($permohonan) {
|
||||
$legalitasItems = $permohonan->documents?->flatMap(function ($document) {
|
||||
return $document->detail->map(function ($detail) {
|
||||
// Jika tidak ada jenis legalitas jaminan, lewati
|
||||
if (empty($detail->jenisLegalitasJaminan)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Hanya tampilkan detail yang memiliki dokumen_jaminan
|
||||
if (empty($detail->dokumen_jaminan)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Tampilkan nama legalitas jaminan saja
|
||||
return $detail->jenisLegalitasJaminan->name ?? '';
|
||||
});
|
||||
})->filter()->unique()->values()->toArray();
|
||||
|
||||
// Buat daftar bernomor
|
||||
$result = '';
|
||||
foreach ($legalitasItems as $index => $item) {
|
||||
$result .= ($index + 1) . '. ' . $item . "\n";
|
||||
}
|
||||
|
||||
return $result;
|
||||
})(),
|
||||
'nama_pemilik' => $permohonan->documents?->pluck('pemilik.name')
|
||||
->unique()
|
||||
->implode(', '),
|
||||
'luas_tanah' => $luas_tanah . ' m²',
|
||||
'nilai_tanah' => formatRupiah($nilai_tanah, 2),
|
||||
'luas_bangunan' => $luas_bangunan . ' m²',
|
||||
'nilai_bangunan' => formatRupiah($nilai_bangunan, 2),
|
||||
'nilai_njop' => formatRupiah($permohonan->nilai_njop, 2),
|
||||
'nilai_pasar_wajar' => formatRupiah($npw, 2),
|
||||
'nilai_likuidasi' => formatRupiah($nilai_liquidasi, 2),
|
||||
'tanggal_documen_diterima' => $permohonan->documents?->map(function ($document) {
|
||||
return $document->created_at->format('d-m-Y');
|
||||
}),
|
||||
'tanggal_spk' => '',
|
||||
'nomor_spk' => '',
|
||||
'tanggal_rencana_kunjunagn' => '',
|
||||
'tanggal_kunjungan' => '',
|
||||
'taggal_delivered' => '',
|
||||
'jangka_waktu_sla' => '',
|
||||
'nama_penilai' => $permohonan->penilaian?->_user_penilai?->userPenilaiTeam?->name,
|
||||
'nama_team_leader' => $permohonan->penilaian?->teams,
|
||||
'saran' => '',
|
||||
'catatan' => '',
|
||||
|
||||
|
||||
'tanggal_permohonan' => $permohonan->tanggal_permohonan,
|
||||
'tanggal_laporan' => $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? '',
|
||||
'tanggal_review' => $permohonan->penilaian?->tanggal_kunjungan ?? '',
|
||||
];
|
||||
});
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = $request->get('page') ?: 1;
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function export(Request $request)
|
||||
{
|
||||
return Excel::download(new LaporanHasilPenilaianJaminanInternalExternalExport($request), 'laporan_hasil_penilaian_jaminan_internal_external.xlsx');
|
||||
}
|
||||
}
|
||||
43
app/Http/Controllers/LaporanMonitoringSoController.php
Normal file
43
app/Http/Controllers/LaporanMonitoringSoController.php
Normal file
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Services\LaporanMonitoringSoService;
|
||||
|
||||
class LaporanMonitoringSoController extends Controller
|
||||
{
|
||||
|
||||
private $laporanMonitoringSoService;
|
||||
|
||||
public function __construct(LaporanMonitoringSoService $laporanMonitoringSoService)
|
||||
{
|
||||
$this->laporanMonitoringSoService = $laporanMonitoringSoService;
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$user = auth()->user()->load('roles');
|
||||
$result = $this->laporanMonitoringSoService->progresPengerjaanLaporan($user);
|
||||
return view('lpj::laporan-monitoring.index', compact('result'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show details data.
|
||||
* @return Response
|
||||
*/
|
||||
|
||||
public function show($id){
|
||||
return view('lpj::laporan-monitoring.show', compact('id'));
|
||||
}
|
||||
|
||||
|
||||
public function dataForDatatablePenilai(Request $request, $id){
|
||||
return $this->laporanMonitoringSoService->showDetailsPermohonan($request, $id);
|
||||
}
|
||||
|
||||
}
|
||||
140
app/Http/Controllers/LaporanPembatalanController.php
Normal file
140
app/Http/Controllers/LaporanPembatalanController.php
Normal file
@@ -0,0 +1,140 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Exports\LaporanPembatalanExport;
|
||||
use Modules\Lpj\Models\PermohonanPembatalan;
|
||||
|
||||
class LaporanPembatalanController extends Controller
|
||||
{
|
||||
public $user;
|
||||
|
||||
public function index()
|
||||
{
|
||||
return view('lpj::laporan_pembatalan.index');
|
||||
}
|
||||
|
||||
public function export(Request $request)
|
||||
{
|
||||
return Excel::download(new LaporanPembatalanExport($request), 'laporan_pembatalan.xlsx');
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = PermohonanPembatalan::query();
|
||||
|
||||
|
||||
if (!Auth::user()->hasAnyRole(['administrator'])) {
|
||||
$query = $query->whereHas('permohonan', function ($q) {
|
||||
$q->where('branch_id', Auth::user()->branch_id);
|
||||
});
|
||||
}
|
||||
|
||||
$query = $query->orderBy('created_at', 'desc');
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = json_decode($request->get('search'));
|
||||
|
||||
if (isset($search->start_date) || isset($search->end_date)) {
|
||||
$query->whereBetween('created_at', [
|
||||
$search->start_date ?? '1900-01-01',
|
||||
$search->end_date ?? now()->toDateString()
|
||||
]);
|
||||
}
|
||||
|
||||
// Filter by branch if provided
|
||||
if (isset($search->branch_id) && !empty($search->branch_id)) {
|
||||
$query->whereHas('permohonan', function ($q) use ($search) {
|
||||
$q->where('branch_id', $search->branch_id);
|
||||
});
|
||||
}
|
||||
|
||||
if (isset($search->search)) {
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->whereHas('permohonan', function ($subq) use ($search) {
|
||||
$subq->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%');
|
||||
$subq->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$subq->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
});
|
||||
$q->orWhere('alasan_pembatalan', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search->search . '%');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
$size = $request->get('size', 10);
|
||||
if ($size == 0) {
|
||||
$size = 10;
|
||||
}
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->get();
|
||||
|
||||
$data = $data->map(function ($item) {
|
||||
return [
|
||||
'id' => $item->id,
|
||||
'nomor_registrasi' => $item->permohonan->nomor_registrasi ?? '-',
|
||||
'tanggal_permohonan' => $item->permohonan->tanggal_permohonan ? date('d-m-Y', strtotime($item->permohonan->tanggal_permohonan)) : '-',
|
||||
'tanggal_pembatalan' => date('d-m-Y', strtotime($item->created_at)),
|
||||
'cabang' => $item->permohonan->branch->name ?? '-',
|
||||
'pemohon' => $item->permohonan->user->name ?? '-',
|
||||
'debitur' => $item->permohonan->debiture->name ?? '-',
|
||||
'alasan_pembatalan' => $item->alasan_pembatalan,
|
||||
'status' => $item->status,
|
||||
'diajukan_oleh' => $item->user->name ?? '-',
|
||||
'disetujui_oleh' => $item->authorized_by ? $item->authorizedUser->name : '-',
|
||||
'tanggal_disetujui' => $item->authorized_at ? formatTanggalIndonesia(strtotime($item->authorized_at),1) : '-'
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $size);
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = max(1, $request->get('page', 1));
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
}
|
||||
226
app/Http/Controllers/LaporanPenilaiJaminanController.php
Normal file
226
app/Http/Controllers/LaporanPenilaiJaminanController.php
Normal file
@@ -0,0 +1,226 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\StatusPermohonan;
|
||||
use Modules\Lpj\Exports\LaporanPenilaiJaminanExport;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Models\Branch;
|
||||
use Modules\Lpj\Services\PreviewLaporanService;
|
||||
use Modules\Lpj\Models\Inspeksi;
|
||||
use Modules\Lpj\Models\Penilai;
|
||||
|
||||
class LaporanPenilaiJaminanController extends Controller
|
||||
{
|
||||
public $user;
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
|
||||
protected $previewLaporanService;
|
||||
|
||||
public function __construct(PreviewLaporanService $previewLaporanService)
|
||||
{
|
||||
$this->previewLaporanService = $previewLaporanService;
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$status_permohonan = StatusPermohonan::all();
|
||||
return view('lpj::laporan-penilai-jaminan.index', compact('status_permohonan'));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Show the specified resource.
|
||||
*/
|
||||
public function show($permohonan_id, $dokumen_id, $jaminan_id)
|
||||
{
|
||||
$back = route('laporan-penilai-jaminan.index');
|
||||
return $this->previewLaporanService->previewLaporan($permohonan_id, $dokumen_id, $jaminan_id, $back);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
|
||||
$user = auth()->user();
|
||||
|
||||
|
||||
// Check permissions
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
// abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
$userRole = $user->roles->pluck('name')->first();
|
||||
$regionId = null;
|
||||
|
||||
// If user is senior-officer, get their regionId
|
||||
if ($userRole === 'senior-officer') {
|
||||
$userTeam = TeamsUsers::with('team')->firstWhere('user_id', $user->id);
|
||||
$regionId = $userTeam?->team->regions_id;
|
||||
}
|
||||
$paramsSearch = null;
|
||||
// dd($startDate);
|
||||
// Retrieve data from the database
|
||||
$query = Permohonan::query();
|
||||
$query = $query->where('status', 'done')->orderBy('tanggal_permohonan', 'desc');
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = json_decode($request->get('search'));
|
||||
|
||||
if (!empty($search->start_date) || !empty($search->end_date)) {
|
||||
$startDate = $search->start_date ?? '1900-01-01';
|
||||
$endDate = $search->end_date ?? now()->toDateString();
|
||||
|
||||
$query->where(function ($q) use ($startDate, $endDate) {
|
||||
|
||||
$q->whereHas('penilaian', function ($q2) use ($startDate, $endDate) {
|
||||
$q2->whereBetween('tanggal_kunjungan', [$startDate, $endDate]);
|
||||
});
|
||||
|
||||
// OR check if has penawaran with date in range
|
||||
$q->orWhereHas('penawaran', function ($q3) use ($startDate, $endDate) {
|
||||
$q3->whereBetween('tanggal_penilaian_sebelumnya', [$startDate, $endDate]);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (isset($search->branch_id) && !empty($search->branch_id)) {
|
||||
$query->where('branch_id', $search->branch_id);
|
||||
}
|
||||
|
||||
if (isset($search->laporan) && is_array($search->laporan) && !empty($search->laporan)) {
|
||||
foreach ($search->laporan as $type) {
|
||||
$query->whereHas('penilai', function ($q) use ($type) {
|
||||
$q->where('type_penilai', 'LIKE', '%' . $type . '%');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// dd($search->search);
|
||||
|
||||
if (isset($search->search)) {
|
||||
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('debiture', DB::raw('LOWER(name)'), 'LIKE', '%' . strtolower($search->search) . '%');
|
||||
|
||||
$q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search->search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
|
||||
// Get data with necessary relationships
|
||||
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan.jenisJaminan','nilaiPlafond', 'penilai', 'dokumenjaminan.inspeksi'])->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $size);
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = max(1, $request->get('page', 1));
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function export(Request $request)
|
||||
{
|
||||
$startDate = $request->input('start_date');
|
||||
$endDate = $request->input('end_date');
|
||||
|
||||
// Validate the date format
|
||||
if (isset($startDate) && isset($endDate)) {
|
||||
$startDate = date('Y-m-d', strtotime($startDate));
|
||||
$endDate = date('Y-m-d', strtotime($endDate));
|
||||
|
||||
if ($startDate > $endDate) {
|
||||
return redirect()->back()->with('error', 'Tanggal awal tidak boleh lebih kecil dari tanggal akhir');
|
||||
}
|
||||
}
|
||||
// name the file
|
||||
$filename = $this->createNameLaporan($request);
|
||||
|
||||
return Excel::download(
|
||||
new LaporanPenilaiJaminanExport($request),
|
||||
$filename
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
public function createNameLaporan($request)
|
||||
{
|
||||
$startDate = $request->start_date ?? null;
|
||||
$endDate = $request->end_date ?? null;
|
||||
$branchId = $request->branch_id ?? null;
|
||||
$laporan = $request->laporan ?? null;
|
||||
|
||||
// Initialize filename parts
|
||||
$parts = ['Laporan Penilai Jaminan'];
|
||||
if ($startDate && $endDate) {
|
||||
$parts[] = "{$startDate}_{$endDate}";
|
||||
}
|
||||
if ($laporan) {
|
||||
$parts[] = $laporan;
|
||||
}
|
||||
if ($branchId) {
|
||||
$parts[] = $this->getBranchId($branchId);
|
||||
}
|
||||
// Return concatenated filename with extension
|
||||
return implode('_', $parts) . '.xlsx';
|
||||
}
|
||||
|
||||
public function getBranchId($branchId)
|
||||
{
|
||||
$branchesName = Branch::find($branchId)->name ?? null;
|
||||
return $branchesName;
|
||||
}
|
||||
}
|
||||
180
app/Http/Controllers/LaporanPenilaianJaminanController.php
Normal file
180
app/Http/Controllers/LaporanPenilaianJaminanController.php
Normal file
@@ -0,0 +1,180 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Exports\LaporanPenilaianJaminanExport;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\Penilaian;
|
||||
use Modules\Lpj\Models\PenawaranTender;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class LaporanPenilaianJaminanController extends Controller
|
||||
{
|
||||
public $user;
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('lpj::laporan_penilaian_jaminan.index');
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('laporan-admin-kredit.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view laporan admin kredit.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = Permohonan::query();
|
||||
$query = $query->where('status', 'done');
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = json_decode($request->get('search'));
|
||||
|
||||
|
||||
if (!empty($search->start_date) || !empty($search->end_date)) {
|
||||
$startDate = $search->start_date ?? '1900-01-01';
|
||||
$endDate = $search->end_date ?? now()->toDateString();
|
||||
|
||||
$query->where(function ($q) use ($startDate, $endDate) {
|
||||
$q->whereHas('penilaian', function ($q2) use ($startDate, $endDate) {
|
||||
$q2->whereBetween('tanggal_kunjungan', [$startDate, $endDate]);
|
||||
})
|
||||
->orWhereHas('penawaran', function ($q3) use ($startDate, $endDate) {
|
||||
$q3->whereBetween('tanggal_penilaian_sebelumnya', [$startDate, $endDate]);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Filter by branch if provided
|
||||
if (isset($search->branch_id) && !empty($search->branch_id)) {
|
||||
$query->where('branch_id', $search->branch_id);
|
||||
}
|
||||
|
||||
if (isset($search->penilai_id) && !empty($search->penilai_id)) {
|
||||
$query->whereHas('penilaian._user_penilai.userPenilaiTeam', function ($q) use ($search) {
|
||||
$q->where('user_id', $search->penilai_id);
|
||||
});
|
||||
}
|
||||
|
||||
if (isset($search->search)) {
|
||||
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('debiture', DB::raw('LOWER(name)'), 'LIKE', '%' . strtolower($search->search) . '%');
|
||||
|
||||
$q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search->search . '%');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->with(['debiture.branch'])->get();
|
||||
|
||||
$data = $data->map(function ($permohonan) {
|
||||
$luas_tanah = 0;
|
||||
$luas_bangunan = 0;
|
||||
$nilai_tanah = 0;
|
||||
$nilai_bangunan = 0;
|
||||
$npw = 0;
|
||||
$nilai_liquidasi = 0;
|
||||
if (isset($permohonan->penilai->lpj)) {
|
||||
$lpj = json_decode($permohonan->penilai->lpj, true);
|
||||
$npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0);
|
||||
|
||||
$luas_tanah = $lpj['luas_tanah'] ?? 0;
|
||||
$luas_bangunan = $lpj['luas_bangunan'] ?? 0;
|
||||
// Calculate nilai_tanah dynamically by looking for all keys that start with 'nilai_tanah_'
|
||||
$nilai_tanah = str_replace('.', '', $lpj['nilai_tanah_2'] ?? 0);
|
||||
|
||||
$nilai_bangunan = str_replace('.', '', $lpj['nilai_bangunan_2'] ?? 0);
|
||||
$nilai_liquidasi = str_replace('.', '', $lpj['likuidasi_nilai_2'] ?? 0);
|
||||
}
|
||||
|
||||
return [
|
||||
'id' => $permohonan->id,
|
||||
'nomor_registrasi' => $permohonan->nomor_registrasi,
|
||||
'tanggal_permohonan' => $permohonan->tanggal_permohonan,
|
||||
'branch' => $permohonan->debiture?->branch?->name,
|
||||
'name' => $permohonan->debiture?->name,
|
||||
'pemohon' => $permohonan->creator?->name,
|
||||
'tujuan_penilaian' => $permohonan->tujuanPenilaian?->name,
|
||||
'jenis_agunan' => $permohonan->documents?->pluck('jenisJaminan.name')->unique()->implode(', '),
|
||||
'alamat_agunan' => $permohonan->documents?->map(function ($document) {
|
||||
return formatAlamat($document);
|
||||
})->unique()->implode(', '),
|
||||
'luas_tanah' => $luas_tanah . ' m²',
|
||||
'nilai_tanah' => formatRupiah($nilai_tanah, 2),
|
||||
'luas_bangunan' => $luas_bangunan . ' m²',
|
||||
'nilai_bangunan' => formatRupiah($nilai_bangunan, 2),
|
||||
'tanggal_laporan' => $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? '',
|
||||
'tanggal_review' => $permohonan->penilaian?->tanggal_kunjungan ?? '',
|
||||
'nilai_pasar_wajar' => formatRupiah($npw, 2),
|
||||
'nilai_likuidasi' => formatRupiah($nilai_liquidasi, 2),
|
||||
'nama_penilai' => $permohonan->penilaian?->_user_penilai?->userPenilaiTeam?->name,
|
||||
];
|
||||
});
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = $request->get('page', 1);
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function export(Request $request)
|
||||
{
|
||||
$startDate = $request->start_date;
|
||||
$endDate = $request->end_date;
|
||||
// name of the file
|
||||
$fileName = 'laporan_penilaian_jaminan_' . $startDate . '_' . $endDate . '.xlsx';
|
||||
return Excel::download(new LaporanPenilaianJaminanExport($request), $fileName);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
125
app/Http/Controllers/LaporanPermohonanController.php
Normal file
125
app/Http/Controllers/LaporanPermohonanController.php
Normal file
@@ -0,0 +1,125 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\StatusPermohonan;
|
||||
use Modules\Lpj\Exports\LaporanPermohonanExport;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class LaporanPermohonanController extends Controller
|
||||
{
|
||||
public $user;
|
||||
public function index()
|
||||
{
|
||||
return view('lpj::laporan_permohonan.index');
|
||||
}
|
||||
|
||||
public function export(Request $request)
|
||||
{
|
||||
return Excel::download(new LaporanPermohonanExport($request), 'laporan_permohonan.xlsx');
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = Permohonan::query();
|
||||
$query->where('status','done');
|
||||
|
||||
if (!Auth::user()->hasAnyRole(['administrator'])) {
|
||||
$query = $query->where('branch_id', Auth::user()->branch_id);
|
||||
}
|
||||
|
||||
$query = $query->orderBy('nomor_registrasi', 'desc');
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = json_decode($request->get('search'));
|
||||
|
||||
if (isset($search->start_date) || isset($search->end_date)) {
|
||||
$query->whereBetween('tanggal_permohonan', [
|
||||
$search->start_date ?? '1900-01-01',
|
||||
$search->end_date ?? now()->toDateString()
|
||||
]);
|
||||
}
|
||||
|
||||
// Filter by status if provided
|
||||
if (isset($search->status) && !empty($search->status)) {
|
||||
$query->where('status', $search->status);
|
||||
}
|
||||
|
||||
// Filter by branch if provided
|
||||
if (isset($search->branch_id) && !empty($search->branch_id)) {
|
||||
$query->where('branch_id', $search->branch_id);
|
||||
}
|
||||
|
||||
if(isset($search->search)) {
|
||||
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search->search . '%');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
$size = $request->get('size', 10);
|
||||
if ($size == 0) {
|
||||
$size = 10;
|
||||
}
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian','documents','jenisFasilitasKredit', 'jenisPenilaian'])->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $size);
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = max(1, $request->get('page', 1));
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
}
|
||||
32
app/Http/Controllers/LaporanSLAPenilaiController.php
Normal file
32
app/Http/Controllers/LaporanSLAPenilaiController.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Services\LaporanSLAPenilaiService;
|
||||
|
||||
class LaporanSLAPenilaiController extends Controller
|
||||
{
|
||||
private $laporanSLAPenilaiService;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->laporanSLAPenilaiService = app(LaporanSLAPenilaiService::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('lpj::laporan-sla-penilai.index');
|
||||
}
|
||||
|
||||
public function dataForDatatableSLaPenilai(Request $request)
|
||||
{
|
||||
return $this->laporanSLAPenilaiService->dataForDatatables($request);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
304
app/Http/Controllers/LaporanSlikController.php
Normal file
304
app/Http/Controllers/LaporanSlikController.php
Normal file
@@ -0,0 +1,304 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Models\LaporanSlik;
|
||||
use Modules\Lpj\Models\Slik;
|
||||
use Modules\Lpj\Exports\LaporanSlikExport;
|
||||
|
||||
class LaporanSlikController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('lpj::laporan-slik.index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request): JsonResponse
|
||||
{
|
||||
try {
|
||||
$request->validate([
|
||||
'slik_id' => 'required|exists:sliks,id'
|
||||
]);
|
||||
|
||||
$slik = Slik::findOrFail($request->slik_id);
|
||||
|
||||
// Cek apakah data sudah ada di laporan_slik
|
||||
$existing = LaporanSlik::where('slik_id', $slik->id)->first();
|
||||
if ($existing) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Data sudah ada di laporan SLIK'
|
||||
], 422);
|
||||
}
|
||||
|
||||
// Copy data dari tabel slik ke laporan_slik
|
||||
$laporanSlik = LaporanSlik::create([
|
||||
'slik_id' => $slik->id,
|
||||
'sandi_bank' => $slik->sandi_bank,
|
||||
'kode_kantor' => $slik->kode_kantor,
|
||||
'kode_cabang' => $slik->kode_cabang,
|
||||
'tahun' => $slik->tahun,
|
||||
'bulan' => $slik->bulan,
|
||||
'no_rekening' => $slik->no_rekening,
|
||||
'cif' => $slik->cif,
|
||||
'kode_jenis' => $slik->kode_jenis,
|
||||
'kode_jenis_ket' => $slik->kode_jenis_ket,
|
||||
'kode_sifat' => $slik->kode_sifat,
|
||||
'kode_sifat_ket' => $slik->kode_sifat_ket,
|
||||
'kode_valuta' => $slik->kode_valuta,
|
||||
'kode_valuta_ket' => $slik->kode_valuta_ket,
|
||||
'baki_debet' => $slik->baki_debet,
|
||||
'kolektibilitas' => $slik->kolektibilitas,
|
||||
'kolektibilitas_ket' => $slik->kolektibilitas_ket,
|
||||
'tanggal_mulai' => $slik->tanggal_mulai,
|
||||
'tanggal_jatuh_tempo' => $slik->tanggal_jatuh_tempo,
|
||||
'tanggal_selesai' => $slik->tanggal_selesai,
|
||||
'tanggal_restrukturisasi' => $slik->tanggal_restrukturisasi,
|
||||
'kode_sebab_macet' => $slik->kode_sebab_macet,
|
||||
'kode_sebab_macet_ket' => $slik->kode_sebab_macet_ket,
|
||||
'tanggal_macet' => $slik->tanggal_macet,
|
||||
'kode_kondisi' => $slik->kode_kondisi,
|
||||
'kode_kondisi_ket' => $slik->kode_kondisi_ket,
|
||||
'tanggal_kondisi' => $slik->tanggal_kondisi,
|
||||
'nilai_agunan' => $slik->nilai_agunan,
|
||||
'nilai_agunan_ket' => $slik->nilai_agunan_ket,
|
||||
'jenis_agunan' => $slik->jenis_agunan,
|
||||
'kode_agunan' => $slik->kode_agunan,
|
||||
'kode_agunan_ket' => $slik->kode_agunan_ket,
|
||||
'peringkat_agunan' => $slik->peringkat_agunan,
|
||||
'peringkat_agunan_ket' => $slik->peringkat_agunan_ket,
|
||||
'nama_debitur' => $slik->nama_debitur,
|
||||
'npwp' => $slik->npwp,
|
||||
'no_ktp' => $slik->no_ktp,
|
||||
'no_telp' => $slik->no_telp,
|
||||
'kode_kab_kota' => $slik->kode_kab_kota,
|
||||
'kode_kab_kota_ket' => $slik->kode_kab_kota_ket,
|
||||
'kode_negara_domisili' => $slik->kode_negara_domisili,
|
||||
'kode_negara_domisili_ket' => $slik->kode_negara_domisili_ket,
|
||||
'kode_pos' => $slik->kode_pos,
|
||||
'alamat' => $slik->alamat,
|
||||
'fasilitas' => $slik->fasilitas,
|
||||
'status_agunan' => $slik->status_agunan,
|
||||
'tanggal_lapor' => $slik->tanggal_lapor,
|
||||
'status' => 'active',
|
||||
'created_by' => auth()->id(),
|
||||
'updated_by' => auth()->id(),
|
||||
]);
|
||||
|
||||
// Hapus data dari tabel slik setelah berhasil dipindahkan
|
||||
$slik->delete();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Data berhasil dipindahkan ke laporan SLIK',
|
||||
'data' => $laporanSlik
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error moving SLIK to laporan: ' . $e->getMessage());
|
||||
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Terjadi kesalahan saat memindahkan data'
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Data untuk datatables dengan server-side processing
|
||||
*
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
try {
|
||||
// Retrieve data from the database
|
||||
$query = LaporanSlik::query();
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('sandi_bank', 'LIKE', "%$search%")
|
||||
->orWhere('no_rekening', 'LIKE', "%$search%")
|
||||
->orWhere('cif', 'LIKE', "%$search%")
|
||||
->orWhere('nama_debitur', 'LIKE', "%$search%")
|
||||
->orWhere('fasilitas', 'LIKE', "%$search%")
|
||||
->orWhere('status_agunan', 'LIKE', "%$search%");
|
||||
});
|
||||
}
|
||||
|
||||
// Apply year filter
|
||||
if ($request->has('year') && !empty($request->get('year'))) {
|
||||
$query->where('tahun', $request->get('year'));
|
||||
}
|
||||
|
||||
// Apply month filter
|
||||
if ($request->has('month') && !empty($request->get('month'))) {
|
||||
$query->where('bulan', $request->get('month'));
|
||||
}
|
||||
|
||||
// Apply sandi bank filter
|
||||
if ($request->has('sandi_bank') && !empty($request->get('sandi_bank'))) {
|
||||
$query->where('sandi_bank', $request->get('sandi_bank'));
|
||||
}
|
||||
|
||||
// Apply kolektibilitas filter
|
||||
if ($request->has('kolektibilitas') && !empty($request->get('kolektibilitas'))) {
|
||||
$query->where('kolektibilitas', $request->get('kolektibilitas'));
|
||||
}
|
||||
|
||||
// Apply status filter
|
||||
if ($request->has('status') && !empty($request->get('status'))) {
|
||||
$query->where('status', $request->get('status'));
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField', 'created_at');
|
||||
$query->orderBy($column, $order);
|
||||
} else {
|
||||
$query->orderBy('created_at', 'desc');
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->get();
|
||||
|
||||
// Transform data untuk datatables
|
||||
$transformedData = $data->map(function ($item) {
|
||||
return [
|
||||
'id' => $item->id,
|
||||
'sandi_bank' => $item->sandi_bank,
|
||||
'tahun' => $item->tahun,
|
||||
'bulan' => $item->bulan,
|
||||
'no_rekening' => $item->no_rekening,
|
||||
'cif' => $item->cif,
|
||||
'nama_debitur' => $item->nama_debitur,
|
||||
'kolektibilitas' => $item->kolektibilitas,
|
||||
'kolektibilitas_badge' => $item->kolektibilitas_badge ?? '',
|
||||
'fasilitas' => $item->fasilitas,
|
||||
'nilai_agunan' => $item->nilai_agunan_formatted ?? '',
|
||||
'status_agunan' => $item->status_agunan,
|
||||
'status_badge' => $item->status_badge ?? '',
|
||||
'created_by' => $item->creator?->name ?? '-',
|
||||
'created_at' => dateFormat($item->created_at, true) ?? $item->created_at->format('d/m/Y H:i')
|
||||
];
|
||||
});
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / ($request->get('size', 10)));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = $request->get('page', 1);
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $transformedData,
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error in laporan slik datatables: ' . $e->getMessage());
|
||||
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => 0,
|
||||
'recordsFiltered' => 0,
|
||||
'pageCount' => 0,
|
||||
'page' => 1,
|
||||
'totalCount' => 0,
|
||||
'data' => [],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
try {
|
||||
$laporanSlik = LaporanSlik::findOrFail($id);
|
||||
return view('lpj::laporan-slik.show', compact('laporanSlik'));
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error showing laporan slik: ' . $e->getMessage());
|
||||
return back()->with('error', 'Data tidak ditemukan');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Export laporan SLIK to Excel
|
||||
*/
|
||||
public function export(Request $request)
|
||||
{
|
||||
try {
|
||||
$query = LaporanSlik::query();
|
||||
|
||||
// Apply filters
|
||||
if ($request->has('search') && $request->search) {
|
||||
$search = $request->search;
|
||||
$query->where(function($q) use ($search) {
|
||||
$q->where('nama_debitur', 'like', "%{$search}%")
|
||||
->orWhere('no_rekening', 'like', "%{$search}%")
|
||||
->orWhere('cif', 'like', "%{$search}%");
|
||||
});
|
||||
}
|
||||
|
||||
if ($request->has('year') && $request->year) {
|
||||
$query->where('tahun', $request->year);
|
||||
}
|
||||
|
||||
if ($request->has('month') && $request->month) {
|
||||
$query->where('bulan', $request->month);
|
||||
}
|
||||
|
||||
if ($request->has('status') && $request->status) {
|
||||
$query->where('status', $request->status);
|
||||
}
|
||||
|
||||
$filename = 'laporan-slik-' . now()->format('Y-m-d-His') . '.xlsx';
|
||||
|
||||
return Excel::download(new LaporanSlikExport($query), $filename);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error exporting laporan slik: ' . $e->getMessage());
|
||||
return back()->with('error', 'Gagal export data: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
51
app/Http/Controllers/LaporanUserController.php
Normal file
51
app/Http/Controllers/LaporanUserController.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Exports\LaporanUserLimitExport;
|
||||
use Modules\Lpj\Services\LaporanUserService;
|
||||
|
||||
class LaporanUserController extends Controller
|
||||
{
|
||||
|
||||
|
||||
private $laporanUserService;
|
||||
|
||||
public function __construct(LaporanUserService $laporanUserService)
|
||||
{
|
||||
$this->laporanUserService = $laporanUserService;
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
// $user = $this->laporanUserService->getUserPemohon();
|
||||
return view('lpj::laporan-user.index');
|
||||
}
|
||||
|
||||
public function searchUserPemohon(Request $request)
|
||||
{
|
||||
$search = $request->get('search');
|
||||
$user = $this->laporanUserService->getUserPemohon($search);
|
||||
return response()->json($user);
|
||||
}
|
||||
|
||||
public function dataTableForUserPemohon(Request $request)
|
||||
{
|
||||
return $this->laporanUserService->dataForDatatables($request);
|
||||
}
|
||||
|
||||
public function export(Request $request)
|
||||
{
|
||||
$startDate = $request->start_date;
|
||||
$endDate = $request->end_date;
|
||||
// name of the file
|
||||
$fileName = 'laporan_user_limit' . $startDate . '_' . $endDate . '.xlsx';
|
||||
return Excel::download(new LaporanUserLimitExport($request), $fileName);
|
||||
}
|
||||
}
|
||||
558
app/Http/Controllers/MemoController.php
Normal file
558
app/Http/Controllers/MemoController.php
Normal file
@@ -0,0 +1,558 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use Exception;
|
||||
use Modules\Lpj\Models\Noc;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Barryvdh\DomPDF\Facade\Pdf;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class MemoController extends Controller
|
||||
{
|
||||
public $user;
|
||||
|
||||
/**
|
||||
* Menampilkan halaman index memo penyelesaian
|
||||
*
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
Log::info('MemoController: Mengakses halaman index memo penyelesaian');
|
||||
return view('lpj::memo.index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Menampilkan form untuk membuat memo penyelesaian dengan data yang dipilih
|
||||
*
|
||||
* @param Request $request
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function create(Request $request)
|
||||
{
|
||||
Log::info('MemoController: Mengakses halaman create memo penyelesaian');
|
||||
|
||||
$selectedIds = $request->get('selected_ids', []);
|
||||
|
||||
// Pastikan $selectedIds selalu berupa array
|
||||
if (is_string($selectedIds)) {
|
||||
$selectedIds = explode(',', $selectedIds);
|
||||
}
|
||||
|
||||
// Filter array untuk menghilangkan nilai kosong
|
||||
$selectedIds = array_filter($selectedIds, function($id) {
|
||||
return !empty(trim($id));
|
||||
});
|
||||
|
||||
$permohonanList = [];
|
||||
$totalBiayaPJ = 0;
|
||||
|
||||
if (!empty($selectedIds) && count($selectedIds) > 0) {
|
||||
try {
|
||||
$permohonanList = Permohonan::with([
|
||||
'user',
|
||||
'debiture',
|
||||
'branch',
|
||||
'tujuanPenilaian',
|
||||
'penilaian',
|
||||
'jenisFasilitasKredit',
|
||||
'documents.inspeksi',
|
||||
'penilai',
|
||||
'documents.detail',
|
||||
'noc'
|
||||
])->whereIn('id', $selectedIds)->get();
|
||||
|
||||
// Hitung total biaya PJ dari nominal_bayar di tabel NOC
|
||||
$totalBiayaPJ = Noc::whereIn('permohonan_id', $selectedIds)
|
||||
->sum('nominal_bayar');
|
||||
|
||||
Log::info('MemoController: Total Biaya PJ dihitung: ' . $totalBiayaPJ);
|
||||
|
||||
} catch (Exception $e) {
|
||||
Log::error('MemoController: Error saat mengambil data permohonan - ' . $e->getMessage());
|
||||
return redirect()->back()->with('error', 'Terjadi kesalahan saat memuat data');
|
||||
}
|
||||
}
|
||||
|
||||
return view('lpj::memo.create', compact('permohonanList', 'totalBiayaPJ'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Menyimpan memo penyelesaian yang telah dibuat
|
||||
*
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
Log::info('MemoController: Memulai proses penyimpanan memo penyelesaian');
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
// Validasi input
|
||||
$request->validate([
|
||||
'permohonan_ids' => 'required|array',
|
||||
'permohonan_ids.*' => 'exists:permohonan,id',
|
||||
'memo_number' => 'required|string|max:255',
|
||||
'payment_date' => 'required|date',
|
||||
'memo_date' => 'required|date'
|
||||
]);
|
||||
|
||||
$permohonanIds = $request->permohonan_ids;
|
||||
$memoNumber = $request->memo_number;
|
||||
$paymentDate = $request->payment_date;
|
||||
$memoDate = $request->memo_date;
|
||||
|
||||
// Update status permohonan yang dipilih
|
||||
foreach ($permohonanIds as $permohonanId) {
|
||||
$permohonan = Permohonan::find($permohonanId);
|
||||
if ($permohonan) {
|
||||
$permohonan->status = 'memo-penyelesaian';
|
||||
$permohonan->memo_penyelesaian_number = $memoNumber;
|
||||
$permohonan->memo_penyelesaian_date = $memoDate;
|
||||
$permohonan->memo_penyelesaian_payment_date = $paymentDate;
|
||||
$permohonan->memo_penyelesaian_created_at = now();
|
||||
//$permohonan->save();
|
||||
|
||||
Log::info('MemoController: Berhasil update permohonan ID: ' . $permohonanId);
|
||||
}
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
Log::info('MemoController: Berhasil menyimpan memo penyelesaian untuk ' . count($permohonanIds) . ' permohonan');
|
||||
|
||||
return redirect()->route('memo.index')
|
||||
->with('success', 'Memo penyelesaian berhasil dibuat untuk ' . count($permohonanIds) . ' permohonan');
|
||||
|
||||
} catch (Exception $e) {
|
||||
DB::rollback();
|
||||
Log::error('MemoController: Error saat menyimpan memo penyelesaian - ' . $e->getMessage());
|
||||
|
||||
return redirect()->back()
|
||||
->withInput()
|
||||
->with('error', 'Terjadi kesalahan saat menyimpan memo penyelesaian: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Menampilkan detail memo penyelesaian
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
Log::info('MemoController: Mengakses detail memo penyelesaian ID: ' . $id);
|
||||
|
||||
$permohonan = Permohonan::with([
|
||||
'user',
|
||||
'debiture',
|
||||
'branch',
|
||||
'tujuanPenilaian',
|
||||
'penilaian',
|
||||
'jenisFasilitasKredit',
|
||||
'documents.inspeksi',
|
||||
'penilai',
|
||||
'documents.detail',
|
||||
'noc'
|
||||
])->findOrFail($id);
|
||||
|
||||
return view('lpj::memo.show', compact('permohonan'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Mengambil data untuk datatables pada halaman memo penyelesaian
|
||||
*
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
Log::info('MemoController: Mengambil data untuk datatables');
|
||||
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
Log::warning('MemoController: User tidak memiliki permission untuk melihat data');
|
||||
// abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
// Mengambil data dari database dengan kondisi yang sama seperti LaporanController
|
||||
$query = Permohonan::query()
|
||||
->whereIn('status', ['proses-laporan', 'done', 'paparan', 'proses-paparan', 'memo-penyelesaian'])
|
||||
/*->whereNotNull('approval_so_at')
|
||||
->whereNotNull('approval_eo_at')
|
||||
->where(function ($q) {
|
||||
$q->whereIn('nilai_plafond_id', [1, 4])
|
||||
->whereNotNull('approval_dd_at')
|
||||
->orWhereIn('nilai_plafond_id', [2, 3]);
|
||||
})*/
|
||||
->whereHas('noc'); // Hanya tampilkan permohonan yang memiliki NOC
|
||||
|
||||
|
||||
$query = $query->orderBy('nomor_registrasi', 'desc');
|
||||
|
||||
// Apply search filter jika ada
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$searchParams = explode('|', $request->get('search'));
|
||||
|
||||
$filterJenisPenilaian = $searchParams[0] ?? '';
|
||||
$searchTerm = $searchParams[1] ?? '';
|
||||
|
||||
// Filter berdasarkan jenis penilaian
|
||||
if (!empty($filterJenisPenilaian)) {
|
||||
$query->where('jenis_penilaian_id', $filterJenisPenilaian);
|
||||
Log::info('Applied jenis penilaian filter', ['filter' => $filterJenisPenilaian]);
|
||||
}
|
||||
|
||||
$query->where(function ($q) use ($searchTerm) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $searchTerm . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $searchTerm . '%');
|
||||
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $searchTerm . '%');
|
||||
$q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $searchTerm . '%');
|
||||
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $searchTerm . '%');
|
||||
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $searchTerm . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $searchTerm . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting jika ada
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Mendapatkan total count records
|
||||
$totalRecords = $query->count();
|
||||
$size = $request->get('size', 10);
|
||||
if ($size == 0) {
|
||||
$size = 10;
|
||||
}
|
||||
|
||||
// Apply pagination jika ada
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size;
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Mendapatkan filtered count records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Mendapatkan data untuk halaman saat ini
|
||||
$data = $query->with([
|
||||
'user',
|
||||
'debiture',
|
||||
'branch',
|
||||
'tujuanPenilaian',
|
||||
'jenisPenilaian',
|
||||
'penilaian',
|
||||
'jenisFasilitasKredit',
|
||||
'documents.inspeksi',
|
||||
'penilai',
|
||||
'documents.detail',
|
||||
'noc'
|
||||
])->get();
|
||||
|
||||
// Menghitung page count
|
||||
$pageCount = ceil($totalRecords / $size);
|
||||
|
||||
// Menghitung current page number
|
||||
$currentPage = max(1, $request->get('page', 1));
|
||||
|
||||
Log::info('MemoController: Berhasil mengambil data datatables - Total: ' . $totalRecords . ', Filtered: ' . $filteredRecords);
|
||||
|
||||
// Return response data sebagai JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Mengambil total biaya PJ berdasarkan permohonan yang dipilih
|
||||
*
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function getTotalBiayaPJ(Request $request)
|
||||
{
|
||||
Log::info('MemoController: Mengambil total biaya PJ');
|
||||
|
||||
try {
|
||||
$permohonanIds = $request->get('permohonan_ids', []);
|
||||
|
||||
// Pastikan $permohonanIds selalu berupa array
|
||||
if (is_string($permohonanIds)) {
|
||||
$permohonanIds = explode(',', $permohonanIds);
|
||||
}
|
||||
|
||||
// Filter array untuk menghilangkan nilai kosong
|
||||
$permohonanIds = array_filter($permohonanIds, function($id) {
|
||||
return !empty(trim($id));
|
||||
});
|
||||
|
||||
$totalBiayaPJ = 0;
|
||||
|
||||
if (!empty($permohonanIds) && count($permohonanIds) > 0) {
|
||||
// Hitung total biaya PJ dari nominal_bayar di tabel NOC
|
||||
$totalBiayaPJ = \Modules\Lpj\Models\Noc::whereIn('permohonan_id', $permohonanIds)
|
||||
->sum('nominal_bayar');
|
||||
}
|
||||
|
||||
Log::info('MemoController: Total Biaya PJ berhasil dihitung: ' . $totalBiayaPJ);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'total_biaya_pj' => $totalBiayaPJ,
|
||||
'total_biaya_pj_formatted' => 'Rp ' . number_format($totalBiayaPJ, 0, ',', '.')
|
||||
]);
|
||||
|
||||
} catch (Exception $e) {
|
||||
Log::error('MemoController: Error saat menghitung total biaya PJ - ' . $e->getMessage());
|
||||
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Terjadi kesalahan saat menghitung total biaya PJ'
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Menampilkan preview memo penyelesaian sebelum menyimpan
|
||||
*
|
||||
* @param Request $request
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function preview(Request $request)
|
||||
{
|
||||
Log::info('MemoController: Mengakses halaman preview memo penyelesaian');
|
||||
|
||||
|
||||
$permohonanIds = $request->permohonan_ids;
|
||||
$memoNumber = $request->memo_number;
|
||||
$paymentDate = $request->payment_date;
|
||||
$memoDate = $request->memo_date;
|
||||
|
||||
try {
|
||||
// Ambil data permohonan yang dipilih
|
||||
$permohonanList = Permohonan::with([
|
||||
'user',
|
||||
'debiture',
|
||||
'branch',
|
||||
'penilaian',
|
||||
'jenisPenilaian',
|
||||
'jenisFasilitasKredit',
|
||||
'documents.inspeksi',
|
||||
'penilai',
|
||||
'documents.detail',
|
||||
'noc'
|
||||
])->whereIn('id', $permohonanIds);
|
||||
|
||||
// Hitung total biaya PJ dari nominal_bayar di tabel NOC
|
||||
$totalBiayaPJ = Noc::whereIn('permohonan_id', $permohonanIds)
|
||||
->sum('nominal_bayar');
|
||||
|
||||
// Data untuk template memo
|
||||
$memoData = [
|
||||
'memo_number' => $memoNumber,
|
||||
'memo_date' => $memoDate,
|
||||
'payment_date' => $paymentDate,
|
||||
'total_biaya_pj' => $totalBiayaPJ,
|
||||
'permohonan_list' => $permohonanList->get(),
|
||||
'debitur_count' => $permohonanList->get()->count(),
|
||||
'jaminan_info' => $this->getJaminanInfo($permohonanList->get()),
|
||||
'jenisPenilaian' => $permohonanList->pluck('jenis_penilaian_id')->first()
|
||||
];
|
||||
|
||||
$permohonanList= $permohonanList->get();
|
||||
|
||||
Log::info('MemoController: Data preview memo berhasil disiapkan');
|
||||
|
||||
return view('lpj::memo.preview', compact('memoData', 'permohonanList', 'totalBiayaPJ'));
|
||||
|
||||
} catch (Exception $e) {
|
||||
Log::error('MemoController: Error saat menyiapkan preview memo - ' . $e->getMessage());
|
||||
return redirect()->back()
|
||||
->withInput()
|
||||
->with('error', 'Terjadi kesalahan saat menyiapkan preview memo: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate PDF memo penyelesaian dan simpan ke database
|
||||
*
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
public function generatePdf(Request $request)
|
||||
{
|
||||
Log::info('MemoController: Memulai generate PDF memo penyelesaian');
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
// Validasi input
|
||||
|
||||
$permohonanIds = $request->permohonan_ids;
|
||||
$memoNumber = $request->memo_number;
|
||||
$paymentDate = $request->payment_date;
|
||||
$memoDate = $request->memo_date;
|
||||
|
||||
// Ambil data permohonan yang dipilih
|
||||
$permohonanList = Permohonan::with([
|
||||
'user',
|
||||
'debiture',
|
||||
'branch',
|
||||
'penilaian',
|
||||
'jenisPenilaian',
|
||||
'jenisFasilitasKredit',
|
||||
'documents.inspeksi',
|
||||
'penilai',
|
||||
'documents.detail',
|
||||
'noc'
|
||||
])->whereIn('id', $permohonanIds);
|
||||
|
||||
// Hitung total biaya PJ dari nominal_bayar di tabel NOC
|
||||
$totalBiayaPJ = Noc::whereIn('permohonan_id', $permohonanIds)
|
||||
->sum('nominal_bayar');
|
||||
|
||||
// Data untuk template memo
|
||||
$memoData = [
|
||||
'memo_number' => $memoNumber,
|
||||
'memo_date' => $memoDate,
|
||||
'payment_date' => $paymentDate,
|
||||
'total_biaya_pj' => $totalBiayaPJ,
|
||||
'permohonan_list' => $permohonanList->get(),
|
||||
'debitur_count' => $permohonanList->get()->count(),
|
||||
'jaminan_info' => $this->getJaminanInfo($permohonanList->get()),
|
||||
'jenisPenilaian' => $permohonanList->pluck('jenis_penilaian_id')->first()
|
||||
];
|
||||
|
||||
$permohonanList= $permohonanList->get();
|
||||
|
||||
// Generate PDF dari template
|
||||
$pdf = Pdf::loadView('lpj::memo.pdf-template', compact('memoData', 'permohonanList', 'totalBiayaPJ'))
|
||||
->setPaper('a4', 'portrait')
|
||||
->setOptions([
|
||||
'defaultFont' => 'Times-Roman',
|
||||
'isRemoteEnabled' => true,
|
||||
'isHtml5ParserEnabled' => true,
|
||||
'isPhpEnabled' => true,
|
||||
'dpi' => 150,
|
||||
'defaultPaperSize' => 'a4',
|
||||
'chroot' => public_path(),
|
||||
]);
|
||||
|
||||
// Nama file PDF
|
||||
$fileName = 'memo-penyelesaian-' . str_replace(['/', ' '], ['-', '-'], $memoNumber) . '-' . date('Y-m-d-H-i-s') . '.pdf';
|
||||
$filePath = 'memo-penyelesaian/' . $fileName;
|
||||
|
||||
// Simpan PDF ke storage
|
||||
Storage::disk('public')->put($filePath, $pdf->output());
|
||||
|
||||
// Update status permohonan yang dipilih
|
||||
// Update data di tabel NOC untuk setiap permohonan
|
||||
foreach ($permohonanIds as $permohonanId) {
|
||||
// Cari NOC berdasarkan permohonan_id
|
||||
$noc = Noc::where('permohonan_id', $permohonanId)->first();
|
||||
|
||||
if ($noc) {
|
||||
// Update field memo penyelesaian di tabel NOC
|
||||
$noc->memo_penyelesaian = $filePath;
|
||||
$noc->memo_penyelesaian_number = $memoNumber;
|
||||
$noc->memo_penyelesaian_date = $memoDate;
|
||||
$noc->memo_penyelesaian_payment_date = $paymentDate;
|
||||
$noc->memo_penyelesaian_created_at = now();
|
||||
$noc->save();
|
||||
|
||||
Log::info('MemoController: Berhasil update NOC untuk permohonan ID: ' . $permohonanId);
|
||||
} else {
|
||||
Log::warning('MemoController: NOC tidak ditemukan untuk permohonan ID: ' . $permohonanId);
|
||||
}
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
Log::info('MemoController: Berhasil generate PDF dan menyimpan memo penyelesaian untuk ' . count($permohonanIds) . ' permohonan');
|
||||
|
||||
// Return PDF untuk download
|
||||
return $pdf->download('memo-penyelesaian-' . $memoNumber . '.pdf');
|
||||
|
||||
} catch (Exception $e) {
|
||||
DB::rollback();
|
||||
Log::error('MemoController: Error saat generate PDF memo penyelesaian - ' . $e->getMessage());
|
||||
|
||||
return redirect()->back()
|
||||
->with('error', 'Terjadi kesalahan saat generate PDF memo penyelesaian: ' . $e->getMessage())
|
||||
->withInput();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function untuk mendapatkan informasi jaminan
|
||||
*
|
||||
* @param $permohonanList
|
||||
* @return string
|
||||
*/
|
||||
private function getJaminanInfo($permohonanList)
|
||||
{
|
||||
$jaminanTypes = [];
|
||||
foreach ($permohonanList as $permohonan) {
|
||||
if ($permohonan->tujuanPenilaian) {
|
||||
$jaminanTypes[] = $permohonan->tujuanPenilaian->name;
|
||||
}
|
||||
}
|
||||
|
||||
$uniqueJaminan = array_unique($jaminanTypes);
|
||||
return implode(' & ', $uniqueJaminan);
|
||||
}
|
||||
/**
|
||||
* Download PDF memo penyelesaian
|
||||
*
|
||||
* @param int $id - ID permohonan
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function downloadPdf($id)
|
||||
{
|
||||
Log::info('MemoController: Download PDF memo penyelesaian untuk permohonan ID: ' . $id);
|
||||
|
||||
try {
|
||||
// Cari NOC berdasarkan permohonan_id
|
||||
$noc = Noc::where('permohonan_id', $id)->first();
|
||||
|
||||
if (!$noc || !$noc->memo_penyelesaian) {
|
||||
Log::warning('MemoController: PDF memo penyelesaian tidak ditemukan untuk permohonan ID: ' . $id);
|
||||
return redirect()->back()->with('error', 'File PDF memo penyelesaian tidak ditemukan.');
|
||||
}
|
||||
|
||||
// Cek apakah file ada di storage
|
||||
if (!Storage::disk('public')->exists($noc->memo_penyelesaian)) {
|
||||
Log::warning('MemoController: File PDF tidak ada di storage: ' . $noc->memo_penyelesaian);
|
||||
return redirect()->back()->with('error', 'File PDF tidak ditemukan di server.');
|
||||
}
|
||||
|
||||
// Download file
|
||||
$fileName = 'memo-penyelesaian-' . $noc->memo_penyelesaian_number . '.pdf';
|
||||
|
||||
Log::info('MemoController: Berhasil download PDF memo penyelesaian: ' . $fileName);
|
||||
|
||||
return Storage::disk('public')->download($noc->memo_penyelesaian, $fileName);
|
||||
|
||||
} catch (Exception $e) {
|
||||
Log::error('MemoController: Error saat download PDF memo penyelesaian - ' . $e->getMessage());
|
||||
return redirect()->back()->with('error', 'Terjadi kesalahan saat mengunduh file PDF.');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
use App\Http\Controllers\Controller;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Exports\NilaiPlafondExport;
|
||||
use Modules\Lpj\Http\Requests\NilaiPlafondRequest;
|
||||
@@ -14,137 +16,239 @@
|
||||
{
|
||||
public $user;
|
||||
|
||||
/**
|
||||
* Menampilkan halaman daftar Nilai Plafond.
|
||||
* Log setiap akses dan sebelum return view.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('lpj::nilai_plafond.index');
|
||||
Log::info('NilaiPlafondController@index: akses halaman index');
|
||||
return \view('lpj::nilai_plafond.index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Menyimpan data Nilai Plafond baru termasuk field biaya.
|
||||
* Gunakan validasi dari NilaiPlafondRequest, log proses, dan bungkus dengan transaksi DB.
|
||||
*/
|
||||
public function store(NilaiPlafondRequest $request)
|
||||
{
|
||||
Log::info('NilaiPlafondController@store: mulai proses simpan');
|
||||
$validate = $request->validated();
|
||||
|
||||
if ($validate) {
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
// Save to database
|
||||
NilaiPlafond::create($validate);
|
||||
return redirect()
|
||||
$record = NilaiPlafond::create($validate);
|
||||
DB::commit();
|
||||
|
||||
Log::info('NilaiPlafondController@store: simpan berhasil', ['id' => $record->id]);
|
||||
return \redirect()
|
||||
->route('basicdata.nilai-plafond.index')
|
||||
->with('success', 'Jenis Aset created successfully');
|
||||
->with('success', 'Nilai Plafond berhasil dibuat');
|
||||
} catch (Exception $e) {
|
||||
return redirect()
|
||||
DB::rollBack();
|
||||
Log::error('NilaiPlafondController@store: simpan gagal', ['error' => $e->getMessage()]);
|
||||
|
||||
return \redirect()
|
||||
->route('basicdata.nilai-plafond.create')
|
||||
->with('error', 'Failed to create nilai plafond');
|
||||
->with('error', 'Gagal membuat Nilai Plafond');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Menampilkan form pembuatan Nilai Plafond.
|
||||
* Log akses sebelum return view.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
return view('lpj::nilai_plafond.create');
|
||||
Log::info('NilaiPlafondController@create: akses halaman create');
|
||||
return \view('lpj::nilai_plafond.create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Menampilkan form edit Nilai Plafond berdasarkan ID.
|
||||
* Gunakan transaksi untuk pembacaan data dan logging.
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
$nilaiPlafond = NilaiPlafond::find($id);
|
||||
return view('lpj::nilai_plafond.create', compact('nilaiPlafond'));
|
||||
Log::info('NilaiPlafondController@edit: mulai proses edit', ['id' => $id]);
|
||||
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
$nilaiPlafond = NilaiPlafond::find($id);
|
||||
DB::commit();
|
||||
|
||||
Log::info('NilaiPlafondController@edit: data ditemukan', ['id' => $id]);
|
||||
return \view('lpj::nilai_plafond.create', compact('nilaiPlafond'));
|
||||
} catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
Log::error('NilaiPlafondController@edit: gagal mengambil data', ['id' => $id, 'error' => $e->getMessage()]);
|
||||
return \redirect()
|
||||
->route('basicdata.nilai-plafond.index')
|
||||
->with('error', 'Gagal mengambil data Nilai Plafond');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Memperbarui data Nilai Plafond termasuk field biaya.
|
||||
* Validasi input, logging, dan gunakan transaksi DB.
|
||||
*/
|
||||
public function update(NilaiPlafondRequest $request, $id)
|
||||
{
|
||||
Log::info('NilaiPlafondController@update: mulai proses update', ['id' => $id]);
|
||||
$validate = $request->validated();
|
||||
|
||||
if ($validate) {
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
// Update in database
|
||||
$nilaiPlafond = NilaiPlafond::find($id);
|
||||
if (!$nilaiPlafond) {
|
||||
Log::warning('NilaiPlafondController@update: data tidak ditemukan', ['id' => $id]);
|
||||
DB::rollBack();
|
||||
return \redirect()
|
||||
->route('basicdata.nilai-plafond.index')
|
||||
->with('error', 'Data Nilai Plafond tidak ditemukan');
|
||||
}
|
||||
|
||||
$nilaiPlafond->update($validate);
|
||||
return redirect()
|
||||
DB::commit();
|
||||
|
||||
Log::info('NilaiPlafondController@update: update berhasil', ['id' => $id]);
|
||||
return \redirect()
|
||||
->route('basicdata.nilai-plafond.index')
|
||||
->with('success', 'Jenis Aset updated successfully');
|
||||
->with('success', 'Nilai Plafond berhasil diperbarui');
|
||||
} catch (Exception $e) {
|
||||
return redirect()
|
||||
DB::rollBack();
|
||||
Log::error('NilaiPlafondController@update: update gagal', ['id' => $id, 'error' => $e->getMessage()]);
|
||||
|
||||
return \redirect()
|
||||
->route('basicdata.nilai-plafond.edit', $id)
|
||||
->with('error', 'Failed to update nilai plafond');
|
||||
->with('error', 'Gagal memperbarui Nilai Plafond');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Menghapus data Nilai Plafond berdasarkan ID.
|
||||
* Logging setiap langkah dan gunakan transaksi DB.
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
Log::info('NilaiPlafondController@destroy: mulai proses hapus', ['id' => $id]);
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
// Delete from database
|
||||
$nilaiPlafond = NilaiPlafond::find($id);
|
||||
$nilaiPlafond->delete();
|
||||
if (!$nilaiPlafond) {
|
||||
DB::rollBack();
|
||||
Log::warning('NilaiPlafondController@destroy: data tidak ditemukan', ['id' => $id]);
|
||||
return \response()->json(['success' => false, 'message' => 'Data Nilai Plafond tidak ditemukan']);
|
||||
}
|
||||
|
||||
echo json_encode(['success' => true, 'message' => 'Jenis Aset deleted successfully']);
|
||||
$nilaiPlafond->delete();
|
||||
DB::commit();
|
||||
|
||||
Log::info('NilaiPlafondController@destroy: hapus berhasil', ['id' => $id]);
|
||||
return \response()->json(['success' => true, 'message' => 'Nilai Plafond berhasil dihapus']);
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(['success' => false, 'message' => 'Failed to delete nilai plafond']);
|
||||
DB::rollBack();
|
||||
Log::error('NilaiPlafondController@destroy: hapus gagal', ['id' => $id, 'error' => $e->getMessage()]);
|
||||
return \response()->json(['success' => false, 'message' => 'Gagal menghapus Nilai Plafond']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Menyediakan data untuk datatables dengan pencarian, sortir, dan paginasi.
|
||||
* Logging proses dan gunakan transaksi DB untuk konsistensi pembacaan.
|
||||
*/
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
Log::info('NilaiPlafondController@dataForDatatables: mulai proses');
|
||||
|
||||
if (is_null($this->user) || !$this->user->can('nilai_plafond.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = NilaiPlafond::query();
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
// Retrieve data from the database
|
||||
$query = NilaiPlafond::query();
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('code', 'LIKE', "%$search%");
|
||||
$q->orWhere('name', 'LIKE', "%$search%");
|
||||
});
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('code', 'LIKE', "%$search%");
|
||||
$q->orWhere('name', 'LIKE', "%$search%");
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = 0 + 1;
|
||||
|
||||
DB::commit();
|
||||
Log::info('NilaiPlafondController@dataForDatatables: proses selesai, mengembalikan data');
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return \response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
Log::error('NilaiPlafondController@dataForDatatables: gagal memproses data', ['error' => $e->getMessage()]);
|
||||
return \response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => 0,
|
||||
'recordsFiltered' => 0,
|
||||
'pageCount' => 0,
|
||||
'page' => 1,
|
||||
'totalCount' => 0,
|
||||
'data' => [],
|
||||
]);
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = 0 + 1;
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Mengekspor data Nilai Plafond ke Excel.
|
||||
* Log akses sebelum proses download.
|
||||
*/
|
||||
public function export()
|
||||
{
|
||||
Log::info('NilaiPlafondController@export: mulai proses export');
|
||||
return Excel::download(new NilaiPlafondExport, 'nilai_plafond.xlsx');
|
||||
}
|
||||
}
|
||||
|
||||
427
app/Http/Controllers/NocController.php
Normal file
427
app/Http/Controllers/NocController.php
Normal file
@@ -0,0 +1,427 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Modules\Lpj\Http\Requests\NocRequest;
|
||||
use Modules\Lpj\Models\Bucok;
|
||||
use Modules\Lpj\Models\Noc;
|
||||
use Modules\Lpj\Models\PersetujuanPenawaran;
|
||||
use Modules\Lpj\Models\JenisPenilaian;
|
||||
|
||||
class NocController extends Controller
|
||||
{
|
||||
public $user;
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return redirect()->route('noc.pembayaran.index');
|
||||
}
|
||||
|
||||
public function pembayaran()
|
||||
{
|
||||
$persetujuanPenawarans = PersetujuanPenawaran::all();
|
||||
$jenisPenilaians = JenisPenilaian::get();
|
||||
return view('lpj::noc.pembayaran', compact('persetujuanPenawarans', 'jenisPenilaians'));
|
||||
}
|
||||
|
||||
public function penyelesaian()
|
||||
{
|
||||
$persetujuanPenawarans = PersetujuanPenawaran::all();
|
||||
$jenisPenilaians = JenisPenilaian::get();
|
||||
return view('lpj::noc.penyelesaian', compact('persetujuanPenawarans', 'jenisPenilaians'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(NocRequest $request)
|
||||
{
|
||||
$validated = $request->validated();
|
||||
|
||||
|
||||
$validated['updated_by'] = Auth::id();
|
||||
if (request()->get('status_bayar') == "sudah_bayar") {
|
||||
$validated['status'] = '1';
|
||||
}
|
||||
|
||||
$dataNoc = [
|
||||
'nominal_bayar' => $validated['nominal_bayar'],
|
||||
'total_pembukuan' => $validated['total_pembukuan'],
|
||||
'tanggal_pembayaran' => $validated['tanggal_pembayaran'] ?? date('Y-m-d'),
|
||||
'status_bayar' => $validated['nominal_bayar'] < $validated['total_harus_bayar'] ? false : true,
|
||||
'catatan_noc' => $validated['catatan_noc'] ?? '',
|
||||
'status_kurang_bayar' => $validated['status_kurang_bayar'] ?? '0',
|
||||
'status_lebih_bayar' => $validated['status_lebih_bayar'] ?? '0',
|
||||
'nominal_kurang_bayar' => $validated['nominal_kurang_bayar'] ?? '0',
|
||||
'nominal_lebih_bayar' => $validated['nominal_lebih_bayar'] ?? '0',
|
||||
'bukti_pengembalian' => $validated['bukti_pengembalian'] ?? '',
|
||||
];
|
||||
|
||||
if($validated['permohonan_id']){
|
||||
$noc = Noc::updateOrCreate(
|
||||
[
|
||||
'permohonan_id' => $validated['permohonan_id'],
|
||||
'persetujuan_penawaran_id' => $validated['persetujuan_penawaran_id'],
|
||||
],
|
||||
$dataNoc,
|
||||
);
|
||||
} else {
|
||||
$noc = Noc::updateOrCreate(
|
||||
[
|
||||
'persetujuan_penawaran_id' => $validated['persetujuan_penawaran_id'],
|
||||
],
|
||||
$dataNoc,
|
||||
);
|
||||
}
|
||||
|
||||
$folderPath = 'noc/' . request()->get('persetujuan_penawaran_id') . '/bukti_ksl/';
|
||||
|
||||
if ($request->hasFile('bukti_ksl')) {
|
||||
$noc->bukti_ksl = $request->file('bukti_ksl')->store(
|
||||
$folderPath,
|
||||
'public',
|
||||
);
|
||||
}
|
||||
$noc->save();
|
||||
|
||||
$bucok = Bucok::where('nomor_tiket', $noc->nomor_tiket)->orWhere('permohonan_id', $noc->permohonan_id)->first();
|
||||
if($bucok){
|
||||
$bucok->nominal_penyelesaian = $noc->total_pembukuan ?? '';
|
||||
$bucok->tanggal_penyelesaian = $noc->tanggal_pembayaran ?? date('Y-m-d');
|
||||
$bucok->penyelesaian = 'Selesai';
|
||||
$bucok->save();
|
||||
}
|
||||
|
||||
return redirect()
|
||||
->route('noc.index')->with('success', 'NOC berhasil disimpan.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(NocRequest $request, PersetujuanPenawaran $persetujuanPenawaran)
|
||||
{
|
||||
$validated = $request->validated();
|
||||
|
||||
|
||||
if($request->get('is_memo')){
|
||||
|
||||
$memo = Noc::find($request->get('is_memo'));
|
||||
|
||||
$folderPath = 'noc/' . request()->get('persetujuan_penawaran_id') . '/memo_penyelesaian/';
|
||||
|
||||
if ($request->hasFile('memo_penyelesaian')) {
|
||||
$memo->memo_penyelesaian = $request->file('memo_penyelesaian')->store(
|
||||
$folderPath,
|
||||
'public',
|
||||
);
|
||||
}
|
||||
|
||||
$memo->catatan_noc = $validated['catatan_noc'];
|
||||
$memo->save();
|
||||
|
||||
|
||||
return redirect()
|
||||
->route('laporan.index')->with('success', 'Memo Penyelesaian updated successfully');
|
||||
}
|
||||
$dataNoc = [
|
||||
'total_pembukuan' => $validated['total_pembukuan'],
|
||||
'nominal_penyelesaian' => $validated['nominal_penyelesaian'],
|
||||
'tanggal_penyelesaian' => $validated['tanggal_penyelesaian'] ?? date('Y-m-d'),
|
||||
'status_pelunasan' => ((int)$validated['nominal_bayar'] + (int)$validated['nominal_penyelesaian']) === (int)$validated['total_harus_bayar'] ? true : false,
|
||||
'catatan_noc' => $validated['catatan_noc'],
|
||||
];
|
||||
|
||||
|
||||
$noc = Noc::updateOrCreate(
|
||||
[
|
||||
'permohonan_id' => $validated['permohonan_id'],
|
||||
'permohonan_id' => $validated['permohonan_id'],
|
||||
'persetujuan_penawaran_id' => $validated['persetujuan_penawaran_id'],
|
||||
],
|
||||
$dataNoc,
|
||||
);
|
||||
|
||||
$folderPath = 'noc/' . request()->get('persetujuan_penawaran_id') . '/bukti_penyelesaian/';
|
||||
|
||||
if ($request->hasFile('bukti_penyelesaian')) {
|
||||
$noc->bukti_penyelesaian = $request->file('bukti_penyelesaian')->store(
|
||||
$folderPath,
|
||||
'public',
|
||||
);
|
||||
}
|
||||
$noc->save();
|
||||
|
||||
|
||||
return redirect()
|
||||
->route('noc.index')->with('success', 'NOC updated successfully');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
return view('lpj::noc.create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(Noc $noc) {
|
||||
return view('lpj::noc.memo', compact('noc'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
$persetujuanPenawaran = PersetujuanPenawaran::where('id', $id)->first();
|
||||
return view('lpj::noc.form', compact('persetujuanPenawaran'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(PersetujuanPenawaran $persetujuanPenawaran)
|
||||
{
|
||||
$persetujuanPenawaran->delete();
|
||||
|
||||
return redirect()
|
||||
->route('noc.index')->with('success', 'Persetujuan Penawaran deleted successfully');
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
// Redirect to pembayaran datatables by default
|
||||
return $this->dataForDatatablesPembayaran($request);
|
||||
}
|
||||
|
||||
public function dataForDatatablesPembayaran(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('noc.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view persetujuan penawaran.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = PersetujuanPenawaran::query();
|
||||
|
||||
// Filter for pembayaran (where memo_penyelesaian is null)
|
||||
/*$query->whereDoesntHave('noc', function($q) {
|
||||
$q->whereNotNull('memo_penyelesaian');
|
||||
});*/
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->orWhereRelation('penawaran', 'nomor_registrasi', 'LIKE', '%' . $search . '%')
|
||||
->orWhereRelation('permohonan', 'nomor_registrasi', 'LIKE', '%' . $search . '%')
|
||||
->orWhereRelation('permohonan.debiture','name', 'LIKE', '%' . $search . '%')
|
||||
->orWhereRelation('permohonan.jenisPenilaian', 'name', 'LIKE', '%' . $search . '%')
|
||||
->orWhere('nomor_tiket', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->get();
|
||||
|
||||
$data = $data->map(function ($persetujuanPenawaran) {
|
||||
return [
|
||||
'id' => $persetujuanPenawaran->id,
|
||||
'nomor_registrasi' => $persetujuanPenawaran->permohonan?->nomor_registrasi ?? $persetujuanPenawaran->penawaran?->nomor_registrasi,
|
||||
'nomor_tiket' => $persetujuanPenawaran->nomor_tiket ?? '',
|
||||
'nama_debitur' => $persetujuanPenawaran?->permohonan?->debiture->name ?? $persetujuanPenawaran->penawaran?->permohonan?->debiture->name ?? $persetujuanPenawaran->noc?->debiture->name,
|
||||
'kode_cabang' => $persetujuanPenawaran?->permohonan?->branch->code ?? $persetujuanPenawaran->penawaran?->permohonan?->branch->code ?? $persetujuanPenawaran->noc?->branch->code,
|
||||
'cabang' => $persetujuanPenawaran?->permohonan?->branch->name ?? $persetujuanPenawaran->penawaran?->permohonan?->branch->name ?? $persetujuanPenawaran->noc?->branch->name,
|
||||
'tanggal_pembayaran' => dateFormat(
|
||||
$persetujuanPenawaran->noc->tanggal_pembayaran ?? $persetujuanPenawaran->noc?->created_at,
|
||||
true,
|
||||
),
|
||||
'nominal_bayar' => currencyFormat($persetujuanPenawaran->nominal_bayar ?? 0,
|
||||
),
|
||||
'nominal_diterima' => currencyFormat(
|
||||
$persetujuanPenawaran->noc->nominal_bayar ?? 0,
|
||||
),
|
||||
'jenis_penilaian' => $persetujuanPenawaran->permohonan?->jenisPenilaian?->name ?? "",
|
||||
'bukti_ksl' => $persetujuanPenawaran->noc->bukti_ksl ?? $persetujuanPenawaran->bukti_ksl ?? null,
|
||||
'bukti_bayar' => $persetujuanPenawaran->bukti_bayar ?? null,
|
||||
'updated_at' => dateFormat($persetujuanPenawaran->updated_at, true),
|
||||
];
|
||||
})->sortBy('updated_at', 1)->values();
|
||||
|
||||
// Calculate total nominal diterima from all filtered data (not just current page)
|
||||
$totalNominalDiterima = $data->sum(function ($item) {
|
||||
// Extract numeric value from formatted currency string
|
||||
$nominal = str_replace(['Rp', '.', ',00'], '', $item['nominal_diterima']);
|
||||
return (float) $nominal;
|
||||
});
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = $request->get('page', 1);
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'totalNominalDiterima' => $totalNominalDiterima,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function dataForDatatablesPenyelesaian(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('noc.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view persetujuan penawaran.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = PersetujuanPenawaran::query();
|
||||
|
||||
// Filter for penyelesaian (where memo_penyelesaian is not null)
|
||||
$query->whereDoesntHave('noc', function($q) {
|
||||
$q->whereNotNull('memo_penyelesaian');
|
||||
});
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->orWhereRelation('penawaran', 'nomor_registrasi', 'LIKE', '%' . $search . '%')
|
||||
->orWhereRelation('permohonan', 'nomor_registrasi', 'LIKE', '%' . $search . '%')
|
||||
->orWhereRelation('permohonan.debiture','name', 'LIKE', '%' . $search . '%')
|
||||
->orWhereRelation('permohonan.jenisPenilaian', 'name', 'LIKE', '%' . $search . '%')
|
||||
->orWhere('nomor_tiket', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('penawaran', 'nomor_registrasi', 'LIKE', '%' . $search . '%')
|
||||
->orWhereRelation('permohonan', 'nomor_registrasi', 'LIKE', '%' . $search . '%')
|
||||
->orWhereRelation('permohonan.debiture','name', 'LIKE', '%' . $search . '%')
|
||||
->orWhereRelation('permohonan.jenisPenilaian', 'name', 'LIKE', '%' . $search . '%')
|
||||
->orWhere('nomor_tiket', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->get();
|
||||
|
||||
$data = $data->map(function ($persetujuanPenawaran) {
|
||||
return [
|
||||
'id' => $persetujuanPenawaran->id,
|
||||
'nomor_registrasi' => $persetujuanPenawaran->permohonan?->nomor_registrasi ?? $persetujuanPenawaran->penawaran?->nomor_registrasi ?? '',
|
||||
'nomor_tiket' => $persetujuanPenawaran->nomor_tiket ?? '',
|
||||
'nama_debitur' => $persetujuanPenawaran->permohonan?->debiture?->name ?? $persetujuanPenawaran->penawaran?->permohonan?->debiture?->name ?? $persetujuanPenawaran->noc?->debiture?->name,
|
||||
'kode_cabang' => $persetujuanPenawaran?->permohonan?->branch?->code ?? $persetujuanPenawaran->penawaran?->permohonan?->branch?->code ?? $persetujuanPenawaran->noc?->branch?->code ?? '',
|
||||
'cabang' => $persetujuanPenawaran->permohonan?->branch?->name ?? $persetujuanPenawaran->penawaran?->permohonan?->branch?->name ?? $persetujuanPenawaran->noc?->branch?->name ?? '',
|
||||
'tanggal_pembayaran' => dateFormat(
|
||||
$persetujuanPenawaran->noc->tanggal_pembayaran ?? $persetujuanPenawaran->noc?->created_at,
|
||||
true,
|
||||
),
|
||||
'nominal_bayar' => currencyFormat($persetujuanPenawaran->nominal_bayar ?? 0,
|
||||
),
|
||||
'nominal_diterima' => currencyFormat(
|
||||
$persetujuanPenawaran->noc->nominal_bayar ?? 0,
|
||||
),
|
||||
'jenis_penilaian' => $persetujuanPenawaran->permohonan?->jenisPenilaian?->name ?? "",
|
||||
'bukti_ksl' => $persetujuanPenawaran->noc->bukti_ksl ?? $persetujuanPenawaran->bukti_ksl ?? null,
|
||||
'bukti_bayar' => $persetujuanPenawaran->bukti_bayar ?? null,
|
||||
'memo_penyelesaian' => $persetujuanPenawaran->noc->memo_penyelesaian ?? $persetujuanPenawaran->memo_penyelesaian ?? null,
|
||||
'nominal_penyelesaian' => currencyFormat(
|
||||
$persetujuanPenawaran->noc->nominal_penyelesaian ?? $persetujuanPenawaran->nominal_penyelesaian ?? 0,
|
||||
),
|
||||
'bukti_penyelesaian' => $persetujuanPenawaran->noc->bukti_penyelesaian ?? $persetujuanPenawaran->bukti_penyelesaian ?? null,
|
||||
'tanggal_penyelesaian' => $persetujuanPenawaran->noc?->tanggal_penyelesaian ? dateFormat(
|
||||
$persetujuanPenawaran->noc?->tanggal_penyelesaian,
|
||||
true) : '-',
|
||||
'updated_at' => dateFormat($persetujuanPenawaran->updated_at, true),
|
||||
];
|
||||
})->sortBy('updated_at', 1)->values();
|
||||
|
||||
|
||||
// Calculate total nominal diterima from all filtered data (not just current page)
|
||||
$totalNominalDiterima = $data->sum(function ($item) {
|
||||
// Extract numeric value from formatted currency string
|
||||
$nominal = str_replace(['Rp', '.', ',00'], '', $item['nominal_diterima']);
|
||||
return (float) $nominal;
|
||||
});
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = $request->get('page', 1);
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'totalNominalDiterima' => $totalNominalDiterima,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -1,290 +1,431 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Exception;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Modules\Lpj\Models\KJPP;
|
||||
use Modules\Lpj\Models\PenawaranDetailTender;
|
||||
use Modules\Lpj\Models\PenawaranDetailTenderLog;
|
||||
use Modules\Lpj\Models\PenawaranTender;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Carbon\Carbon;
|
||||
use Exception;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Models\KJPP;
|
||||
use Modules\Lpj\Models\PenawaranDetailTender;
|
||||
use Modules\Lpj\Models\PenawaranDetailTenderLog;
|
||||
use Modules\Lpj\Models\PenawaranTender;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
|
||||
class OtorisasiPenawaranController extends Controller
|
||||
{
|
||||
public $user;
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
class OtorisasiPenawaranController extends Controller
|
||||
{
|
||||
// dd('hai otorisasi');
|
||||
return view('lpj::otorisasipenawaran.index');
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view users.');
|
||||
public $user;
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
// dd('hai otorisasi');
|
||||
return view('lpj::otorisasipenawaran.index');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query =PenawaranTender::query()
|
||||
->select('penawaran.*',DB::raw("CONCAT(DATE_FORMAT(penawaran.start_date, '%d %M %Y'), ' - ', DATE_FORMAT(penawaran.end_date, '%d %M %Y')) AS date_range"), 'tujuan_penilaian_kjpp.name as tujuan_penilaian_kjpp_name')
|
||||
->leftJoin('tujuan_penilaian_kjpp', 'tujuan_penilaian_kjpp.id','=','penawaran.tujuan_penilaian_kjpp_id')
|
||||
->where('penawaran.status','=','proposal-tender')
|
||||
->withCount('penawarandetails');
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
//$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get();
|
||||
$data = $query->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = 0 + 1;
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data
|
||||
]);
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
return view('lpj::otorisasipenawaran.edit', compact('id'));
|
||||
}
|
||||
|
||||
public function setData(Request $request): JsonResponse
|
||||
{
|
||||
$data = array();
|
||||
$penawaran = array();
|
||||
$penawrandetails = array();
|
||||
$penawarandetailLogs = array();
|
||||
|
||||
if (request()->ajax()) {
|
||||
$id = $request->id;
|
||||
$penawaran = PenawaranTender::where('status','=','proposal-tender')->find($id);
|
||||
|
||||
if ($penawaran) {
|
||||
$penawarandetailLogs = PenawaranDetailTenderLog::where('penawaran_id',$id)
|
||||
->leftJoin('kjpp', 'kjpp.id', '=', 'detail_penawaran_logs.kjpp_rekanan_id')
|
||||
->select('detail_penawaran_logs.*', DB::raw("DATE_FORMAT(detail_penawaran_logs.created_at, '%d-%m-%Y %H:%i') AS created_at2"),'kjpp.code AS kjpp_code', 'kjpp.name AS kjpp_name')
|
||||
->get();
|
||||
$penawrandetails = PenawaranDetailTender::where('penawaran_id','=',$id)
|
||||
->leftJoin('kjpp', 'kjpp.id', '=', 'detail_penawaran.kjpp_rekanan_id')
|
||||
->select('detail_penawaran.*', 'kjpp.code AS kjpp_code', 'kjpp.name AS kjpp_name')
|
||||
->where('detail_penawaran.status','=',1)
|
||||
->get();
|
||||
|
||||
if(sizeof($penawarandetailLogs)>0)
|
||||
{
|
||||
$h=0;
|
||||
foreach($penawarandetailLogs as $obj1)
|
||||
{
|
||||
if($obj1->dokumen_persetujuan && Storage::disk('public')->exists($obj1->dokumen_persetujuan))
|
||||
{
|
||||
$penawarandetailLogs_path = Storage::url($obj1->dokumen_persetujuan);
|
||||
$penawarandetailLogs[$h]->dokumen_persetujuan = $penawarandetailLogs_path;
|
||||
}
|
||||
$h++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$i=0;
|
||||
foreach($penawrandetails as $obj)
|
||||
{
|
||||
if($obj->dokumen_persetujuan && Storage::disk('public')->exists($obj->dokumen_persetujuan))
|
||||
{
|
||||
$penawrandetails_path = Storage::url($obj->dokumen_persetujuan);
|
||||
$penawrandetails[$i]->dokumen_persetujuan = $penawrandetails_path;
|
||||
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
|
||||
$penawaranString = "";
|
||||
if($penawaran->status)
|
||||
{
|
||||
$penawaranString = convertSlug($penawaran->status);
|
||||
$penawaran->status = $penawaranString;
|
||||
}
|
||||
|
||||
$kjpp=null;
|
||||
$kjpp = KJPP::pluck('name', 'id');
|
||||
$data['penawaran'] = $penawaran;
|
||||
$data['penawrandetails'] = $penawrandetails;
|
||||
$data['penawarandetailLogs'] = $penawarandetailLogs;
|
||||
$data['status'] = 'success';
|
||||
$data['message']['message_success'] = array("data successfully found");
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['penawaran'] = null;
|
||||
$data['penawrandetails'] = null;
|
||||
$data['message']['message_data'] = array("data not found");
|
||||
}
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_ajax'] = array("no ajax request");
|
||||
}
|
||||
|
||||
return response()->json($data);
|
||||
}
|
||||
|
||||
public function otorisasiPenawaranKJPP(Request $request, $id): JsonResponse
|
||||
{
|
||||
$data = array();
|
||||
$dataDetailPenawaranLog=[];
|
||||
if (request()->ajax()) {
|
||||
|
||||
// cek masa aktif penawaran
|
||||
$detailpenawaran = PenawaranDetailTender::find($id);
|
||||
$penawaran = PenawaranTender::findOrFail($detailpenawaran->penawaran_id);
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($detailpenawaran->penawaran_id);
|
||||
// cek masa aktif penawaran
|
||||
if($checkActiveDateRange)
|
||||
{
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
|
||||
// update status KJPP yg tidak terpilih menjadi 2 -> kalah
|
||||
// update status Penawaran menjadi SPK
|
||||
// update status Permohonan menjadi SPK
|
||||
// insert detail_permohonan_log
|
||||
|
||||
PenawaranDetailTender::where('status', 1)
|
||||
->where('penawaran_id', $request->penawaran_id)
|
||||
->whereNotIn('id', [$id])
|
||||
->update(['status' => 2,
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
]);
|
||||
|
||||
PenawaranTender::where('id', $request->penawaran_id)
|
||||
->update(['status'=>'spk',
|
||||
'nama_kjpp_sebelumnya'=>$request->kjppName,
|
||||
'biaya_kjpp_sebelumnya'=>$request->biaya_penawaran,
|
||||
'tanggal_penilaian_sebelumnya'=>now(),
|
||||
'authorized_status'=>1,
|
||||
'authorized_at'=>now(),
|
||||
'authorized_by'=>Auth::id(),
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
]);
|
||||
|
||||
Permohonan::where('nomor_registrasi',$request->noReg)
|
||||
->update(['status'=>'spk',
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
]);
|
||||
|
||||
// log
|
||||
$detailPenawaran = PenawaranDetailTender::where('penawaran_id', $request->penawaran_id)->get();
|
||||
if(sizeof($detailPenawaran)>0)
|
||||
{
|
||||
|
||||
foreach ($detailPenawaran as $model) {
|
||||
array_push($dataDetailPenawaranLog, [
|
||||
'detail_penawaran_id' =>$model->id,
|
||||
'kjpp_rekanan_id' =>$model->kjpp_rekanan_id,
|
||||
'penawaran_id' =>$model->penawaran_id,
|
||||
'biaya_penawaran' =>$model->biaya_penawaran,
|
||||
'attachment' =>$model->attachment,
|
||||
'dokumen_persetujuan' =>$model->dokumen_persetujuan,
|
||||
'status' =>$model->status,
|
||||
'authorized_status' =>$model->authorized_status,
|
||||
'authorized_at' =>$model->authorized_at,
|
||||
'authorized_at' =>$model->authorized_at,
|
||||
'created_at' =>$model->created_at,
|
||||
'updated_at' =>$model->updated_at,
|
||||
'deleted_at' =>$model->deleted_at,
|
||||
'created_by' =>$model->created_by,
|
||||
'updated_by' =>$model->updated_by,
|
||||
'deleted_by' =>$model->deleted_by
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
PenawaranDetailTenderLog::insert($dataDetailPenawaranLog);
|
||||
}
|
||||
// log
|
||||
|
||||
DB::commit();
|
||||
$data['status'] = 'success';
|
||||
$data['message']['message_success'] = array('Otorisasi Penawaran KJPP '.$request->kjppName.' successfully');
|
||||
} catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_error'] = array("Otorisasi Penawaran KJPP failed..");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['active_date_range'] = array("Penawaran sudah di tutup");
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_ajax'] = array("no ajax request");
|
||||
}
|
||||
return response()->json($data);
|
||||
}
|
||||
// Retrieve data from the database
|
||||
$query = PenawaranTender::query()->select(
|
||||
'penawaran.*',
|
||||
'debitures.name as debitures_name',
|
||||
'permohonan.tanggal_permohonan',
|
||||
'users.name as user_pemohon',
|
||||
'branches.name as branches_name',
|
||||
'tujuan_penilaian.name as tujuan_penilaian_name',
|
||||
'tujuan_penilaian_kjpp.name as tujuan_penilaian_kjpp_name',
|
||||
)->leftJoin('permohonan', 'permohonan.nomor_registrasi', '=', 'penawaran.nomor_registrasi')->leftJoin(
|
||||
'debitures',
|
||||
'debitures.id',
|
||||
'=',
|
||||
'permohonan.debiture_id',
|
||||
)->leftJoin('users', 'users.id', '=', 'permohonan.user_id')->leftJoin(
|
||||
'branches',
|
||||
'branches.id',
|
||||
'=',
|
||||
'permohonan.branch_id',
|
||||
)->leftJoin('tujuan_penilaian', 'tujuan_penilaian.id', '=', 'permohonan.tujuan_penilaian_id')->leftJoin(
|
||||
'tujuan_penilaian_kjpp',
|
||||
'tujuan_penilaian_kjpp.id',
|
||||
'=',
|
||||
'penawaran.tujuan_penilaian_kjpp_id',
|
||||
)->where('penawaran.status', '=', 'proposal-tender')->withCount('penawarandetails');
|
||||
|
||||
public function show($id)
|
||||
{
|
||||
$prosespenawaran = PenawaranTender::find($id);
|
||||
return view('lpj::otorisasipenawaran.show', compact('id','prosespenawaran'));
|
||||
}
|
||||
}
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
//$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get();
|
||||
$data = $query->get();
|
||||
|
||||
// format date
|
||||
$i = 0;
|
||||
foreach ($data as $obj) {
|
||||
// tanggal_permohonan
|
||||
if ($obj->tanggal_permohonan) {
|
||||
$data[$i]->tanggal_permohonan = Carbon::parse($obj->tanggal_permohonan)->format('d M Y');
|
||||
}
|
||||
|
||||
// date_range
|
||||
$data[$i]->date_range = "-";
|
||||
if ($obj->start_date && $obj->end_date) {
|
||||
$data[$i]->date_range = Carbon::parse($obj->start_date)->format('d M Y') . ' - ' . Carbon::parse(
|
||||
$obj->end_date,
|
||||
)->format('d M Y');
|
||||
}
|
||||
|
||||
$i++;
|
||||
}
|
||||
// format date
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = 0 + 1;
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
// id ==> penawaran.id
|
||||
return view('lpj::otorisasipenawaran.edit', compact('id'));
|
||||
}
|
||||
|
||||
public function setData(Request $request): JsonResponse
|
||||
{
|
||||
$data = [];
|
||||
$penawaran = [];
|
||||
$penawrandetails = [];
|
||||
$penawarandetailLogs = [];
|
||||
|
||||
if (request()->ajax()) {
|
||||
$id = $request->id;
|
||||
$penawaran = PenawaranTender::where('status','=','proposal-tender')->find($id);
|
||||
|
||||
if ($penawaran) {
|
||||
$penawarandetailLogs = PenawaranDetailTenderLog::where('penawaran_id',$id)
|
||||
->leftJoin('kjpp', 'kjpp.id', '=', 'detail_penawaran_logs.kjpp_rekanan_id')
|
||||
->select('detail_penawaran_logs.*', DB::raw("DATE_FORMAT(detail_penawaran_logs.created_at, '%d-%m-%Y %H:%i') AS created_at2"),'kjpp.code AS kjpp_code', 'kjpp.name AS kjpp_name')
|
||||
->get();
|
||||
$penawrandetails = PenawaranDetailTender::where('penawaran_id','=',$id)
|
||||
->leftJoin('kjpp', 'kjpp.id', '=', 'detail_penawaran.kjpp_rekanan_id')
|
||||
->select('detail_penawaran.*', 'kjpp.code AS kjpp_code', 'kjpp.name AS kjpp_name')
|
||||
->where('detail_penawaran.status','=',1)
|
||||
->get();
|
||||
|
||||
if(sizeof($penawarandetailLogs)>0)
|
||||
{
|
||||
$h=0;
|
||||
foreach($penawarandetailLogs as $obj1)
|
||||
{
|
||||
// tgl_proposal
|
||||
if ($obj1->tgl_proposal) {
|
||||
$penawarandetailLogs[$h]->tgl_proposal = Carbon::parse($obj1->tgl_proposal)->format('d M Y');
|
||||
}
|
||||
|
||||
if($obj1->dokumen_persetujuan && Storage::disk('public')->exists($obj1->dokumen_persetujuan))
|
||||
{
|
||||
$penawarandetailLogs_path = Storage::url($obj1->dokumen_persetujuan);
|
||||
$penawarandetailLogs[$h]->dokumen_persetujuan = $penawarandetailLogs_path;
|
||||
}
|
||||
$h++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$i=0;
|
||||
foreach($penawrandetails as $obj)
|
||||
{
|
||||
// tgl_proposal
|
||||
if ($obj->tgl_proposal) {
|
||||
$penawrandetails[$i]->tgl_proposal = Carbon::parse($obj->tgl_proposal)->format('d M Y');
|
||||
}
|
||||
|
||||
if($obj->dokumen_persetujuan && Storage::disk('public')->exists($obj->dokumen_persetujuan))
|
||||
{
|
||||
$penawrandetails_path = Storage::url($obj->dokumen_persetujuan);
|
||||
$penawrandetails[$i]->dokumen_persetujuan = $penawrandetails_path;
|
||||
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
|
||||
$penawaranString = "";
|
||||
if($penawaran->status)
|
||||
{
|
||||
$penawaranString = convertSlug($penawaran->status);
|
||||
$penawaran->status = $penawaranString;
|
||||
}
|
||||
|
||||
$kjpp=null;
|
||||
$kjpp = KJPP::pluck('name', 'id');
|
||||
$data['penawaran'] = $penawaran;
|
||||
$data['penawrandetails'] = $penawrandetails;
|
||||
$data['penawarandetailLogs'] = $penawarandetailLogs;
|
||||
$data['status'] = 'success';
|
||||
$data['message']['message_success'] = array("data successfully found");
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['penawaran'] = null;
|
||||
$data['penawrandetails'] = null;
|
||||
$data['message']['message_data'] = array("data not found");
|
||||
}
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_ajax'] = array("no ajax request");
|
||||
}
|
||||
|
||||
return response()->json($data);
|
||||
}
|
||||
|
||||
public function otorisasiPenawaranKJPP(Request $request, $id): JsonResponse
|
||||
{
|
||||
$data = [];
|
||||
$dataDetailPenawaranLog = [];
|
||||
if (request()->ajax()) {
|
||||
|
||||
// cek masa aktif penawaran
|
||||
$detailpenawaran = PenawaranDetailTender::find($id);
|
||||
$penawaran = PenawaranTender::findOrFail($detailpenawaran->penawaran_id);
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($detailpenawaran->penawaran_id);
|
||||
// cek masa aktif penawaran
|
||||
if($checkActiveDateRange)
|
||||
{
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
|
||||
// update status KJPP yg tidak terpilih menjadi 2 -> kalah
|
||||
// update status Penawaran menjadi persetujuan-penawaran (20241205)
|
||||
// update status Permohonan menjadi persetujuan-penawaran (20241205)
|
||||
// insert detail_permohonan_log
|
||||
|
||||
PenawaranDetailTender::where('status', 1)
|
||||
->where('penawaran_id', $request->penawaran_id)
|
||||
->whereNotIn('id', [$id])
|
||||
->update(['status' => 2,
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
]);
|
||||
// 20241205 arahkan ke persetujuan-penawaran
|
||||
PenawaranTender::where('id', $request->penawaran_id)
|
||||
->update(['status'=>'persetujuan-penawaran',
|
||||
'nama_kjpp_sebelumnya'=>$request->kjppName,
|
||||
'biaya_kjpp_sebelumnya'=>$request->biaya_penawaran,
|
||||
'tanggal_penilaian_sebelumnya'=>now(),
|
||||
'authorized_status'=>1,
|
||||
'authorized_at'=>now(),
|
||||
'authorized_by'=>Auth::id(),
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
]);
|
||||
|
||||
Permohonan::where('nomor_registrasi',$request->noReg)
|
||||
->update(['status'=>'persetujuan-penawaran',
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
]);
|
||||
|
||||
// log
|
||||
$detailPenawaran = PenawaranDetailTender::where('penawaran_id', $request->penawaran_id)->get();
|
||||
if(sizeof($detailPenawaran)>0)
|
||||
{
|
||||
|
||||
foreach ($detailPenawaran as $model) {
|
||||
array_push($dataDetailPenawaranLog, [
|
||||
'detail_penawaran_id' =>$model->id,
|
||||
'kjpp_rekanan_id' =>$model->kjpp_rekanan_id,
|
||||
'penawaran_id' =>$model->penawaran_id,
|
||||
'no_proposal' =>$model->no_proposal,
|
||||
'tgl_proposal' =>$model->tgl_proposal,
|
||||
'biaya_penawaran' =>$model->biaya_penawaran,
|
||||
'attachment' =>$model->attachment,
|
||||
'dokumen_persetujuan' =>$model->dokumen_persetujuan,
|
||||
'status' =>$model->status,
|
||||
'authorized_status' =>$model->authorized_status,
|
||||
'authorized_at' =>$model->authorized_at,
|
||||
'authorized_at' =>$model->authorized_at,
|
||||
'created_at' =>$model->created_at,
|
||||
'updated_at' =>$model->updated_at,
|
||||
'deleted_at' =>$model->deleted_at,
|
||||
'created_by' =>$model->created_by,
|
||||
'updated_by' =>$model->updated_by,
|
||||
'deleted_by' =>$model->deleted_by
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
PenawaranDetailTenderLog::insert($dataDetailPenawaranLog);
|
||||
}
|
||||
// log
|
||||
|
||||
DB::commit();
|
||||
$data['status'] = 'success';
|
||||
$data['message']['message_success'] = array('Otorisasi Penawaran KJPP '.$request->kjppName.' successfully');
|
||||
} catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_error'] = array("Otorisasi Penawaran KJPP failed..");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_error'] = array("Penawaran sudah di tutup");
|
||||
}
|
||||
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_error'] = array("no ajax request");
|
||||
}
|
||||
return response()->json($data);
|
||||
}
|
||||
|
||||
public function show($id)
|
||||
{
|
||||
$prosespenawaran = PenawaranTender::with(['permohonan','tujuanPenilaianKjpp'])->find($id);
|
||||
$permohonan = $prosespenawaran->permohonan;
|
||||
return view('lpj::otorisasipenawaran.show', compact('id','prosespenawaran','permohonan'));
|
||||
}
|
||||
|
||||
public function penawaranulang(Request $request, $id): JsonResponse
|
||||
{
|
||||
// $id ==> penawaran.id
|
||||
$data = [];
|
||||
$dataDetailPenawaranLog=[];
|
||||
if (request()->ajax()) {
|
||||
|
||||
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
|
||||
// update detail_penawaran => detail_penawaran.status = 1 (untuk all KJPP)
|
||||
// update penawaran => penawaran.status ="tender", penawaran.updated_at, penawaran.updated_by
|
||||
// update permohonan => permohonan.status ="tender", permohonan.updated_at, permohonan.updated_by
|
||||
// insert detail_permohonan_log
|
||||
|
||||
PenawaranDetailTender::where('penawaran_id', $id)
|
||||
->update(['status' => 1,
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
]);
|
||||
|
||||
PenawaranTender::where('id', $id)
|
||||
->update(['status'=>'tender',
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
]);
|
||||
|
||||
Permohonan::where('nomor_registrasi',$request->noReg)
|
||||
->update(['status'=>'tender',
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
]);
|
||||
|
||||
$detailPenawaran = PenawaranDetailTender::where('penawaran_id', $id)
|
||||
->distinct()
|
||||
->get();
|
||||
|
||||
// log
|
||||
if(sizeof($detailPenawaran)>0)
|
||||
{
|
||||
|
||||
foreach ($detailPenawaran as $model) {
|
||||
array_push($dataDetailPenawaranLog, [
|
||||
'detail_penawaran_id' =>$model->id,
|
||||
'kjpp_rekanan_id' =>$model->kjpp_rekanan_id,
|
||||
'penawaran_id' =>$model->penawaran_id,
|
||||
'no_proposal' =>$model->no_proposal,
|
||||
'tgl_proposal' =>$model->tgl_proposal,
|
||||
'biaya_penawaran' =>$model->biaya_penawaran,
|
||||
'attachment' =>$model->attachment,
|
||||
'dokumen_persetujuan' =>$model->dokumen_persetujuan,
|
||||
'status' =>$model->status,
|
||||
'authorized_status' =>$model->authorized_status,
|
||||
'authorized_at' =>$model->authorized_at,
|
||||
'authorized_at' =>$model->authorized_at,
|
||||
'created_at' =>$model->created_at,
|
||||
'updated_at' =>$model->updated_at,
|
||||
'deleted_at' =>$model->deleted_at,
|
||||
'created_by' =>$model->created_by,
|
||||
'updated_by' =>$model->updated_by,
|
||||
'deleted_by' =>$model->deleted_by
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
PenawaranDetailTenderLog::insert($dataDetailPenawaranLog);
|
||||
}
|
||||
// log
|
||||
|
||||
DB::commit();
|
||||
$data['detailPenawaran'] = $detailPenawaran;
|
||||
$data['status'] = 'success';
|
||||
$data['message']['message_success'] = array('Penawaran ulang successfully');
|
||||
} catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_error'] = array("Penawaran ulang failed..");
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_error'] = array("no ajax request");
|
||||
}
|
||||
return response()->json($data);
|
||||
}
|
||||
}
|
||||
143
app/Http/Controllers/PembatalanController.php
Normal file
143
app/Http/Controllers/PembatalanController.php
Normal file
@@ -0,0 +1,143 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\PermohonanPembatalan;
|
||||
use Modules\Lpj\Services\PermohonanHistoryService;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class PembatalanController extends Controller
|
||||
{
|
||||
public $user;
|
||||
protected $historyService;
|
||||
|
||||
public function __construct(PermohonanHistoryService $historyService)
|
||||
{
|
||||
$this->historyService = $historyService;
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
return view('lpj::pembatalan.index');
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
$pembatalan = PermohonanPembatalan::with(['permohonan.debiture','permohonan.branch'])->find($id);
|
||||
|
||||
return view(
|
||||
'lpj::pembatalan.form',
|
||||
compact(
|
||||
'pembatalan'
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$pembatalan = PermohonanPembatalan::findOrFail($id);
|
||||
$permohonan = Permohonan::find($pembatalan->permohonan_id);
|
||||
$beforeRequest = $permohonan->toArray();
|
||||
|
||||
try {
|
||||
// Update Permohonan Pembatalan
|
||||
if($request->status=='approved'){
|
||||
$pembatalan->status = 'approved';
|
||||
$pembatalan->authorized_at = now();
|
||||
$pembatalan->authorized_by = auth()->user()->id;
|
||||
$pembatalan->authorized_status = 1;
|
||||
$pembatalan->save();
|
||||
|
||||
$permohonan->status = 'batal';
|
||||
$permohonan->save();
|
||||
} else{
|
||||
$pembatalan->status = 'rejected';
|
||||
$pembatalan->authorized_at = now();
|
||||
$pembatalan->authorized_by = auth()->user()->id;
|
||||
$pembatalan->authorized_status = 3;
|
||||
$pembatalan->save();
|
||||
}
|
||||
|
||||
return redirect()
|
||||
->route('pembatalan.index')->with('success', 'Permohonan Pembatalan updated successfully');
|
||||
} catch (Exception $e) {
|
||||
return redirect()
|
||||
->route('pembatalan.edit', $id)->with('error', 'Failed to update permohonan Pembatalan');
|
||||
}
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = PermohonanPembatalan::query();
|
||||
if (Auth::user()->hasAnyRole(['pemohon-ao','pemohon-eo'])) {
|
||||
$query = $query->whereRelation('permohonan', 'branch_id', Auth::user()->branch_id);
|
||||
}
|
||||
|
||||
$query = $query->orderBy('created_at', 'desc');
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->orWhereRelation('permohonan', 'nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('permohonan.debiture', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('alasan_pembatalan', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
$size = $request->get('size', 10);
|
||||
if ($size == 0) {
|
||||
$size = 10;
|
||||
}
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->with(['permohonan.debiture','permohonan.branch','creator'])->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $size);
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = max(1, $request->get('page', 1));
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
}
|
||||
618
app/Http/Controllers/PembayaranController.php
Normal file
618
app/Http/Controllers/PembayaranController.php
Normal file
@@ -0,0 +1,618 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use Exception;
|
||||
use Modules\Lpj\Models\Noc;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Models\Bucok;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Modules\Lpj\Models\PenawaranTender;
|
||||
use Modules\Lpj\Models\PersetujuanPenawaran;
|
||||
use Modules\Lpj\Http\Requests\PersetujuanPenawaranRequest;
|
||||
|
||||
class PembayaranController extends Controller
|
||||
{
|
||||
public $user;
|
||||
|
||||
public function index()
|
||||
{
|
||||
return view('lpj::pembayaran.index');
|
||||
}
|
||||
|
||||
public function kurang(){
|
||||
return view('lpj::pembayaran.kurang');
|
||||
}
|
||||
|
||||
public function lebih(){
|
||||
return view('lpj::pembayaran.lebih');
|
||||
}
|
||||
|
||||
public function approval()
|
||||
{
|
||||
return view('lpj::pembayaran.approval');
|
||||
}
|
||||
|
||||
public function dataApprovalForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('noc.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view persetujuan penawaran.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = PersetujuanPenawaran::query();
|
||||
if (Auth::user()->hasAnyRole(['pemohon-ao','pemohon-eo'])) {
|
||||
$query = $query->whereRelation('permohonan', 'branch_id', Auth::user()->branch_id);
|
||||
}
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->orWhereRelation('penawaran', 'nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query
|
||||
->with(
|
||||
[
|
||||
'penawaran.permohonan.user',
|
||||
'penawaran.permohonan.debiture',
|
||||
'penawaran.permohonan.branch',
|
||||
'permohonan.debiture',
|
||||
'permohonan.branch',
|
||||
'permohonan.user',
|
||||
'permohonan.approveBayar',
|
||||
'penawaran.permohonan.approveBayar',
|
||||
'penawaran.detail',
|
||||
'penawaran.persetujuan',
|
||||
],
|
||||
)->get();
|
||||
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = $request->get('page', 1);
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function create(){
|
||||
return view('lpj::pembayaran.create');
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
|
||||
$req = request()->all();
|
||||
|
||||
if(isset($req['tiket'])){
|
||||
$persetujuanPenawaran = PersetujuanPenawaran::find($id);
|
||||
$permohonan = Permohonan::find($persetujuanPenawaran?->permohonan_id);
|
||||
} else {
|
||||
$permohonan = Permohonan::find($id);
|
||||
$persetujuanPenawaran = PersetujuanPenawaran::where('permohonan_id', $permohonan->id)->first();
|
||||
}
|
||||
|
||||
return view('lpj::pembayaran.form', compact('permohonan', 'persetujuanPenawaran'));
|
||||
}
|
||||
|
||||
public function editKurang($id){
|
||||
$noc = Noc::find($id);
|
||||
$permohonan = Permohonan::find($noc->permohonan_id);
|
||||
$persetujuanPenawaran = PersetujuanPenawaran::where('permohonan_id', $permohonan->id)->first();
|
||||
return view('lpj::pembayaran.form-kurang', compact('noc','permohonan','persetujuanPenawaran'));
|
||||
}
|
||||
|
||||
public function editLebih($id){
|
||||
$noc = Noc::find($id);
|
||||
$permohonan = Permohonan::find($noc->permohonan_id);
|
||||
$persetujuanPenawaran = PersetujuanPenawaran::where('permohonan_id', $permohonan->id)->first();
|
||||
return view('lpj::pembayaran.form-lebih', compact('noc','permohonan','persetujuanPenawaran'));
|
||||
}
|
||||
|
||||
public function store(PersetujuanPenawaranRequest $request)
|
||||
{
|
||||
$req = request()->all();
|
||||
|
||||
if(isset($req['type'])){
|
||||
if($req['type'] == 'create'){
|
||||
$data = [
|
||||
'nomor_tiket' => $req['nomor_tiket'] ?? '',
|
||||
'nominal_bayar' => $req['nominal_bayar'] ?? '',
|
||||
'catatan' => $req['catatan'] ?? ''
|
||||
];
|
||||
|
||||
if(request()->hasFile('bukti_bayar')){
|
||||
$folderPath = 'persetujuan_penawaran/bukti_bayar/' . $req['nomor_tiket'];
|
||||
$data['bukti_bayar'] = $request->file('bukti_bayar')->store($folderPath, 'public');
|
||||
}
|
||||
|
||||
$persetujuanPenawaran = PersetujuanPenawaran::create($data);
|
||||
$noc = [
|
||||
'persetujuan_penawaran_id' => $persetujuanPenawaran->id,
|
||||
'nomor_tiket' => $req['nomor_tiket'] ?? '',
|
||||
'debiture_id' => $req['debitur_id'] ?? '',
|
||||
'branch_id' => Auth::user()->branch_id,
|
||||
];
|
||||
$noc = Noc::create($noc);
|
||||
|
||||
$bucok = [
|
||||
'tanggal_penuh' => $persetujuanPenawaran->created_at ?? $noc->created_at,
|
||||
'tanggal' => $persetujuanPenawaran->created_at?->format('d') ?? $noc->created_at?->format('d'),
|
||||
'bulan' => $persetujuanPenawaran->created_at?->format('m') ?? $noc->created_at?->format('m'),
|
||||
'tahun' => $persetujuanPenawaran->created_at?->format('Y') ?? $noc->created_at?->format('Y'),
|
||||
'nomor_tiket' => $req['nomor_tiket'] ?? '',
|
||||
'nominal' => $req['nominal_bayar'] ?? '',
|
||||
'nominal_berjalan' => $req['nominal_bayar'] ?? '',
|
||||
'penyelesaian' => 'Belum Selesai',
|
||||
'nama_sub_direktorat' => $noc->branch?->name ?? '',
|
||||
'nama_direktorat_cabang' => $noc->branch?->name ?? '',
|
||||
];
|
||||
|
||||
Bucok::updateOrCreate([
|
||||
'nomor_tiket' => $req['nomor_tiket'] ?? '',
|
||||
], $bucok);
|
||||
|
||||
return redirect()
|
||||
->route('pembayaran.index')->with('success', 'Pembayaran berhasil disimpan.');
|
||||
}
|
||||
|
||||
if($req['type'] == 'kurang_bayar'){
|
||||
$noc = Noc::find($req['noc_id']);
|
||||
$noc->nominal_pelunasan = $req['nominal_pelunasan'];
|
||||
if (request()->hasFile('bukti_ksl_kurang_bayar')) {
|
||||
$folderPath = 'persetujuan_penawaran/bukti_ksl_kurang_bayar/' . $req['noc_id'];
|
||||
$noc->bukti_ksl_kurang_bayar = $request->file('bukti_ksl_kurang_bayar')->store($folderPath, 'public');
|
||||
}
|
||||
$noc->save();
|
||||
|
||||
$persetujuanPenawaran = PersetujuanPenawaran::find($noc->persetujuan_penawaran_id);
|
||||
$persetujuanPenawaran->bukti_ksl_kurang_bayar = $noc->bukti_ksl_kurang_bayar;
|
||||
$persetujuanPenawaran->nominal_kurang_bayar = $req['nominal_pelunasan'];
|
||||
$persetujuanPenawaran->save();
|
||||
return redirect()
|
||||
->route('pembayaran.kurang.index')->with('success', 'Pelunasan Kurang Bayar berhasil disimpan.');
|
||||
}
|
||||
|
||||
if($req['type'] == 'lebih_bayar'){
|
||||
$noc = Noc::find($req['noc_id']);
|
||||
if (request()->hasFile('bukti_ksl_lebih_bayar')) {
|
||||
$folderPath = 'persetujuan_penawaran/bukti_ksl_lebih_bayar/' . $req['noc_id'];
|
||||
$noc->bukti_ksl_lebih_bayar = $request->file('bukti_ksl_lebih_bayar')->store($folderPath, 'public');
|
||||
}
|
||||
$noc->save();
|
||||
|
||||
return redirect()
|
||||
->route('pembayaran.lebih.index')->with('success', 'Pengembalian Lebih Bayar berhasil disimpan.');
|
||||
}
|
||||
}
|
||||
|
||||
$validated = $request->validated();
|
||||
$validated['nominal_bayar'] = $req['nominal_bayar'] ?? 0;
|
||||
$validated['created_by'] = Auth::id();
|
||||
$validated['created_at'] = now();
|
||||
$validated['status'] = '0';
|
||||
|
||||
$persetujuanPenawaran = PersetujuanPenawaran::where('permohonan_id', $validated['permohonan_id'] ?? null)->first();
|
||||
$permohonan = Permohonan::find(request()->get('permohonan_id'));
|
||||
if ($persetujuanPenawaran) {
|
||||
$persetujuanPenawaran->fill($validated);
|
||||
|
||||
if ($request->hasFile('bukti_bayar')) {
|
||||
$folderPath = 'persetujuan_penawaran/' . $validated['penawaran_id'];
|
||||
$persetujuanPenawaran->bukti_bayar = $request->file('bukti_bayar')->store($folderPath, 'public');
|
||||
}
|
||||
|
||||
$persetujuanPenawaran->save();
|
||||
|
||||
$permohonan->approve_bayar_by = null;
|
||||
$permohonan->approve_bayar_at = null;
|
||||
$permohonan->status = 'proses-laporan';
|
||||
$permohonan->save();
|
||||
} else {
|
||||
$persetujuanPenawaran = PersetujuanPenawaran::create(
|
||||
$validated
|
||||
);
|
||||
|
||||
if(isset($validated['nomor_tiket'])){
|
||||
$noc = Noc::where('nomor_tiket',$validated['nomor_tiket'])->first();
|
||||
if($noc){
|
||||
$noc->persetujuan_penawaran_id = $persetujuanPenawaran->id;
|
||||
$noc->permohonan_id = $validated['permohonan_id'];
|
||||
$noc->save();
|
||||
}
|
||||
}
|
||||
|
||||
$folderPath = 'persetujuan_penawaran/' . $validated['penawaran_id'];
|
||||
|
||||
if ($request->hasFile('bukti_bayar')) {
|
||||
$persetujuanPenawaran->bukti_bayar = $request->file('bukti_bayar')->store($folderPath, 'public');
|
||||
}
|
||||
$persetujuanPenawaran->save();
|
||||
}
|
||||
|
||||
$bucok = [
|
||||
'tanggal_penuh' => $persetujuanPenawaran->created_at ?? $validated['created_at'],
|
||||
'tanggal' => $persetujuanPenawaran->created_at?->format('d') ?? $validated['created_at']?->format('d'),
|
||||
'bulan' => $persetujuanPenawaran->created_at?->format('m') ?? $validated['created_at']?->format('m'),
|
||||
'tahun' => $persetujuanPenawaran->created_at?->format('Y') ?? $validated['created_at']?->format('Y'),
|
||||
'nomor_tiket' => $req['nomor_tiket'] ?? '',
|
||||
'nominal' => $req['nominal_bayar'] ?? '',
|
||||
'nominal_berjalan' => $req['nominal_bayar'] ?? '',
|
||||
'penyelesaian' => 'Belum Selesai',
|
||||
'nama_sub_direktorat' => $noc->branch?->name ?? '',
|
||||
'nama_direktorat_cabang' => $noc->branch?->name ?? '',
|
||||
'permohonan_id' => $permohonan->id,
|
||||
'nomor_registrasi' => $permohonan->nomor_registrasi,
|
||||
];
|
||||
|
||||
|
||||
if(isset($req['nomor_tiket']) && $req['nomor_tiket'] !=''){
|
||||
Bucok::updateOrCreate([
|
||||
'nomor_registrasi' => $permohonan->nomor_registrasi,
|
||||
'nomor_tiket' => $req['nomor_tiket'],
|
||||
], $bucok);
|
||||
} else {
|
||||
Bucok::updateOrCreate([
|
||||
'nomor_registrasi' => $permohonan->nomor_registrasi
|
||||
], $bucok);
|
||||
}
|
||||
|
||||
// Update the status of the related permohonan to 'spk'
|
||||
|
||||
if ($permohonan) {
|
||||
$permohonan->status_bayar = request()->get('status_bayar');
|
||||
$permohonan->save();
|
||||
|
||||
// andy add, update status penawaran.status='spk'
|
||||
// $penawaran = PenawaranTender::where('nomor_registrasi',$permohonan->nomor_registrasi)->first();
|
||||
PenawaranTender::where('nomor_registrasi', $permohonan->nomor_registrasi)->update([
|
||||
'status' => 'noc',
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
// andy add, update status penawaran.status='spk'
|
||||
|
||||
}
|
||||
|
||||
return redirect()
|
||||
->route('pembayaran.index')->with('success', 'Pembayaran berhasil disimpan.');
|
||||
}
|
||||
|
||||
public function update(Request $request, $id): JsonResponse
|
||||
{
|
||||
// init
|
||||
$data = [];
|
||||
$output = [];
|
||||
$tindakan = null;
|
||||
if (request()->ajax()) {
|
||||
try {
|
||||
$data = [
|
||||
'approve_bayar_by' => Auth::id(),
|
||||
'approve_bayar_at' => now(),
|
||||
];
|
||||
|
||||
if ($request->keterangan) {
|
||||
$data['approve_keterangan_bayar'] = $request->keterangan;
|
||||
}
|
||||
$output['data'] = $data;
|
||||
|
||||
// Update the status of the related permohonan to 'spk'
|
||||
$permohonan = Permohonan::find($id);
|
||||
|
||||
if ($permohonan) {
|
||||
|
||||
if ($request->type === 'revisi') {
|
||||
$data['status'] = 'revisi-pembayaran';
|
||||
$data['status_bayar'] = 'belum_bayar';
|
||||
} else {
|
||||
$data['status_bayar'] = 'sudah_bayar';
|
||||
$data['status'] = 'proses-laporan';
|
||||
|
||||
if ($permohonan->jenis_penilaian_id == 2) {
|
||||
$data['status_bayar'] = 'sudah_bayar';
|
||||
$data['status'] = 'spk';
|
||||
}
|
||||
}
|
||||
|
||||
if ($permohonan->jenis_penilaian_id == 1) {
|
||||
unset(
|
||||
$data['approval_so'],
|
||||
$data['approval_so_at'],
|
||||
$data['approval_eo'],
|
||||
$data['approval_eo_at'],
|
||||
$data['approval_dd'],
|
||||
$data['approval_dd_at'],
|
||||
$data['keterangan']
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
$permohonan->update($data);
|
||||
|
||||
if ($permohonan->jenis_penilaian_id == 2) {
|
||||
PenawaranTender::where('nomor_registrasi', $permohonan->nomor_registrasi)->update([
|
||||
'status' => 'spk',
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
$output['status'] = 'success';
|
||||
$output['message'] = ['Otorisasi' . $permohonan->nomor_registrasi . 'berhasil di lakukan'];
|
||||
} catch (Exception $e) {
|
||||
$output['status'] = 'error';
|
||||
$output['message'] = ['Otorisasi gagal di lakukan.'];
|
||||
}
|
||||
}
|
||||
return response()->json($output);
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
// abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
$query = PersetujuanPenawaran::query();
|
||||
|
||||
if (Auth::user()->hasAnyRole(['pemohon-ao','pemohon-eo'])) {
|
||||
$query = $query->whereRelation('permohonan', 'branch_id', Auth::user()->branch_id);
|
||||
}
|
||||
|
||||
/*$query->where(function($q) {
|
||||
$q->whereRelation('permohonan', function($query) {
|
||||
$query->where('status_bayar', 'belum_bayar')
|
||||
->where('jenis_penilaian_id', 1);
|
||||
});
|
||||
});*/
|
||||
$query->orWhereRelation('permohonan','status_bayar','revisi-pembayaran');
|
||||
$query->orWhere(function($q) {
|
||||
$q->where('permohonan_id',null);
|
||||
$q->where('nomor_tiket','!=',null);
|
||||
});
|
||||
|
||||
// Pencarian berdasarkan parameter search
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
}
|
||||
|
||||
// Sorting berdasarkan sortField dan sortOrder
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Hitung total records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Pagination (default page size 10)
|
||||
$size = $request->get('size', 10);
|
||||
if ($size == 0) {
|
||||
$size = 10;
|
||||
}
|
||||
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page', 1);
|
||||
$offset = ($page - 1) * $size;
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Filtered records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Ambil data dengan relasi
|
||||
$data = $query->get();
|
||||
|
||||
$data = $data->map(function ($item) {
|
||||
return [
|
||||
'id' => $item->permohonan?->id ?? $item->id,
|
||||
'nomor_registrasi' => $item->permohonan?->nomor_registrasi,
|
||||
'nomor_tiket' => $item->nomor_tiket ?? '',
|
||||
'debiture' => $item->permohonan?->debiture ?? $item->noc?->debiture,
|
||||
'user' => $item->permohonan?->user ?? $item->creator,
|
||||
'status_bayar' => $item->permohonan?->status_bayar ?? ($item->nomor_tiket ? 'Sudah Bayar' : ''),
|
||||
'tanggal_permohonan' => $item->permohonan?->tanggal_permohonan ?? '',
|
||||
'branch' => $item->permohonan?->branch ?? $item->noc?->branch,
|
||||
'is_permohonan' => $item->permohonan ?? ''
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
// Hitung jumlah halaman
|
||||
$pageCount = ceil($totalRecords / $size);
|
||||
|
||||
// Ambil current page
|
||||
$currentPage = max(1, $request->get('page', 1));
|
||||
|
||||
// Return JSON response
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function dataForDatatablesKurang(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
// abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
$query = Noc::query()->where(function ($query) {
|
||||
$query->where(['status_kurang_bayar' => '1'])
|
||||
->where('bukti_ksl_kurang_bayar',null);
|
||||
});
|
||||
|
||||
// Sorting berdasarkan sortField dan sortOrder
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Hitung total records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Pagination (default page size 10)
|
||||
$size = $request->get('size', 10);
|
||||
if ($size == 0) {
|
||||
$size = 10;
|
||||
}
|
||||
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page', 1);
|
||||
$offset = ($page - 1) * $size;
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Filtered records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Ambil data dengan relasi
|
||||
$data = $query->get();
|
||||
|
||||
$data = $data->map(function ($item) {
|
||||
return [
|
||||
'id' => $item->id,
|
||||
'permohonan' => $item->permohonan,
|
||||
'pemohon' => $item->permohonan->user,
|
||||
'branch' => $item->permohonan->branch,
|
||||
'debiture' => $item->permohonan->debiture,
|
||||
'nominal_kurang_bayar' => formatRupiah($item->nominal_kurang_bayar,2)
|
||||
];
|
||||
});
|
||||
|
||||
// Hitung jumlah halaman
|
||||
$pageCount = ceil($totalRecords / $size);
|
||||
|
||||
// Ambil current page
|
||||
$currentPage = max(1, $request->get('page', 1));
|
||||
|
||||
// Return JSON response
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function dataForDatatablesLebih(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
// abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
$query = Noc::query()->where(function ($query) {
|
||||
$query->where(['status_lebih_bayar' => '1'])
|
||||
->where('bukti_ksl_lebih_bayar',null);
|
||||
});
|
||||
|
||||
// Sorting berdasarkan sortField dan sortOrder
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Hitung total records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Pagination (default page size 10)
|
||||
$size = $request->get('size', 10);
|
||||
if ($size == 0) {
|
||||
$size = 10;
|
||||
}
|
||||
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page', 1);
|
||||
$offset = ($page - 1) * $size;
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Filtered records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Ambil data dengan relasi
|
||||
$data = $query->get();
|
||||
|
||||
$data = $data->map(function ($item) {
|
||||
return [
|
||||
'id' => $item->id,
|
||||
'permohonan' => $item->permohonan,
|
||||
'pemohon' => $item->permohonan->user,
|
||||
'branch' => $item->permohonan->branch,
|
||||
'debiture' => $item->permohonan->debiture,
|
||||
'nominal_lebih_bayar' => formatRupiah($item->nominal_lebih_bayar,2)
|
||||
];
|
||||
});
|
||||
|
||||
// Hitung jumlah halaman
|
||||
$pageCount = ceil($totalRecords / $size);
|
||||
|
||||
// Ambil current page
|
||||
$currentPage = max(1, $request->get('page', 1));
|
||||
|
||||
// Return JSON response
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,22 +5,42 @@ namespace Modules\Lpj\Http\Controllers;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Modules\Lpj\Http\Requests\PenilaianRequest;
|
||||
use Modules\Lpj\Models\Authorization;
|
||||
use Modules\Lpj\Models\JenisPenilaian;
|
||||
use Modules\Lpj\Models\LaporanAdminKredit;
|
||||
use Modules\Lpj\Models\Penilaian;
|
||||
use Modules\Lpj\Models\PenilaianTeam;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\StatusPermohonan;
|
||||
use Modules\Lpj\Models\Teams;
|
||||
use Modules\Lpj\Models\Inspeksi;
|
||||
use Modules\Lpj\Models\Penilai;
|
||||
use Modules\Lpj\Models\Regions;
|
||||
use Modules\Lpj\Models\TeamsUsers;
|
||||
use Modules\Location\Models\Province;
|
||||
use Modules\Location\Models\City;
|
||||
use Modules\Location\Models\District;
|
||||
use Modules\Location\Models\Village;
|
||||
use Modules\Usermanagement\Models\User;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Modules\Lpj\Http\Controllers\SurveyorController;
|
||||
use Modules\Lpj\Http\Controllers\PenilaiController;
|
||||
use Modules\Lpj\Http\Requests\FormSurveyorRequest;
|
||||
|
||||
class PenilaianController extends Controller
|
||||
{
|
||||
public $user;
|
||||
protected $surveyorController;
|
||||
protected $penilaiController;
|
||||
|
||||
public function __construct(SurveyorController $surveyorController, PenilaiController $penilaiController)
|
||||
{
|
||||
$this->surveyorController = $surveyorController;
|
||||
$this->penilaiController = $penilaiController;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
@@ -43,12 +63,12 @@ class PenilaianController extends Controller
|
||||
try {
|
||||
DB::beginTransaction();
|
||||
|
||||
$penilaian = Penilaian::create($validatedData);
|
||||
$penilaian = Penilaian::create($validatedData);
|
||||
$validatedData['penilaian_id'] = $penilaian->id;
|
||||
|
||||
$teams_ids = [];
|
||||
$user_ids = [];
|
||||
$roles = [];
|
||||
$user_ids = [];
|
||||
$roles = [];
|
||||
|
||||
if ($validatedData['surveyor_id'] === 'pilih_dari_region') {
|
||||
$surveyor_region_id = $validatedData['surveyor_region_id'];
|
||||
@@ -62,20 +82,28 @@ class PenilaianController extends Controller
|
||||
}
|
||||
|
||||
$teams_ids[] = $surveyor_region_id;
|
||||
$user_ids[] = null;
|
||||
$roles[] = 'surveyor';
|
||||
$user_ids[] = null;
|
||||
$roles[] = 'surveyor';
|
||||
} else {
|
||||
$permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi)->first();
|
||||
$teams_ids[] = $validatedData['teams_id'];
|
||||
$permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi)->first();
|
||||
|
||||
if (isset($validatedData['penilai_surveyor_id'])) {
|
||||
$user_ids[] = $validatedData['penilai_surveyor_id'];
|
||||
if ($validatedData['penilai_surveyor_id'] == 'pilih_dari_region') {
|
||||
$teams_ids[] = $validatedData['surveyor_penilai_region_id'];
|
||||
$user_ids[] = null;
|
||||
|
||||
} else {
|
||||
$teams_ids[] = $validatedData['teams_id'];
|
||||
$user_ids[] = $validatedData['penilai_surveyor_id'];
|
||||
}
|
||||
|
||||
} else {
|
||||
$teams_ids[] = $validatedData['teams_id'];
|
||||
$user_ids[] = $validatedData['surveyor_id'];
|
||||
|
||||
}
|
||||
|
||||
$roles[] = 'surveyor';
|
||||
|
||||
}
|
||||
|
||||
if ($validatedData['penilai_id'] === 'pilih_dari_region') {
|
||||
@@ -90,33 +118,46 @@ class PenilaianController extends Controller
|
||||
}
|
||||
|
||||
$teams_ids[] = $penilaian_region_id;
|
||||
$user_ids[] = null;
|
||||
$roles[] = 'penilai';
|
||||
$user_ids[] = null;
|
||||
$roles[] = 'penilai';
|
||||
} else {
|
||||
$permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi)->first();
|
||||
$teams_ids[] = $validatedData['teams_id'];
|
||||
$permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi)->first();
|
||||
|
||||
|
||||
if (isset($validatedData['penilai_surveyor_id'])) {
|
||||
$user_ids[] = $validatedData['penilai_surveyor_id'];
|
||||
}else {
|
||||
if ($validatedData['penilai_surveyor_id'] == 'pilih_dari_region') {
|
||||
|
||||
|
||||
$permohonan->update([
|
||||
'region_id' => $validatedData['surveyor_penilai_region_id'],
|
||||
]);
|
||||
|
||||
$teams_ids[] = $validatedData['surveyor_penilai_region_id'];
|
||||
$user_ids[] = null;
|
||||
} else {
|
||||
$teams_ids[] = $validatedData['teams_id'];
|
||||
$user_ids[] = $validatedData['penilai_surveyor_id'];
|
||||
}
|
||||
} else {
|
||||
$teams_ids[] = $validatedData['teams_id'];
|
||||
$user_ids[] = $validatedData['penilai_id'];
|
||||
}
|
||||
|
||||
$roles[] = 'penilai';
|
||||
|
||||
}
|
||||
|
||||
// dd($validatedData['penilai_region_id'],$validatedData['teams_id']);
|
||||
foreach ($teams_ids as $key => $teams_id) {
|
||||
PenilaianTeam::create([
|
||||
'penilaian_id' => $validatedData['penilaian_id'],
|
||||
'team_id' => $teams_id,
|
||||
'user_id' => $user_ids[$key],
|
||||
'role' => $roles[$key],
|
||||
'team_id' => $teams_id,
|
||||
'user_id' => $user_ids[$key],
|
||||
'role' => $roles[$key],
|
||||
]);
|
||||
}
|
||||
|
||||
if ($validatedData['surveyor_id'] === 'pilih_dari_region' || $validatedData['penilai_id'] === 'pilih_dari_region') {
|
||||
$status = 'registered';
|
||||
if ($validatedData['surveyor_id'] === 'pilih_dari_region' || $validatedData['penilai_id'] === 'pilih_dari_region' || $validatedData['penilai_surveyor_id'] === 'pilih_dari_region') {
|
||||
$status = 'reassign';
|
||||
} else {
|
||||
$status = 'assign';
|
||||
}
|
||||
@@ -126,11 +167,12 @@ class PenilaianController extends Controller
|
||||
]);
|
||||
|
||||
DB::commit();
|
||||
|
||||
return redirect()->route('penilaian.index')->with('success', 'Penilaian berhasil disimpan');
|
||||
return response()->json(['success' => true, 'message' => 'Data berhasil di-assign.'], 200);
|
||||
} catch (Exception $e) {
|
||||
dd($e);
|
||||
DB::rollBack();
|
||||
return redirect()->route('penilaian.index')->with('error', $e->getMessage());
|
||||
|
||||
return response()->json(['error' => $e->getMessage()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -152,6 +194,8 @@ class PenilaianController extends Controller
|
||||
DB::beginTransaction();
|
||||
$penilaian = Penilaian::where('nomor_registrasi', $request->nomor_registrasi)->first();
|
||||
|
||||
$surveyTeam = null;
|
||||
$penilaiTeam = null;
|
||||
$penilaianId = $penilaian->id;
|
||||
|
||||
$penilainTeam = PenilaianTeam::where('penilaian_id', $penilaianId)->get();
|
||||
@@ -161,28 +205,39 @@ class PenilaianController extends Controller
|
||||
if ($item->role === 'surveyor' && $item->user_id === null) {
|
||||
$item->update([
|
||||
'user_id' => $request->surveyor_id,
|
||||
'role' => 'surveyor',
|
||||
'role' => 'surveyor',
|
||||
]);
|
||||
$surveyTeam = $item->team_id;
|
||||
}
|
||||
|
||||
if ($item->role === 'penilai' && $item->user_id === null) {
|
||||
$item->update([
|
||||
'user_id' => $request->penilai_id,
|
||||
'role' => 'penilai',
|
||||
'role' => 'penilai',
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
if ($item->role === 'penilai' && $surveyTeam) {
|
||||
$penilaiTeam = $item->team_id;
|
||||
}
|
||||
}
|
||||
|
||||
$permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi);
|
||||
|
||||
if ($surveyTeam && $penilaiTeam) {
|
||||
$permohonan->update([
|
||||
'region_id' => $penilaiTeam,
|
||||
]);
|
||||
}
|
||||
$permohonan->update([
|
||||
'status' => 'assign',
|
||||
]);
|
||||
DB::commit();
|
||||
return redirect()->route('penilaian.index')->with('success', 'Penilaian berhasil disimpan');
|
||||
return response()->json(['success' => true, 'message' => 'Data berhasil di-assign.'], 200);
|
||||
} catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
return redirect()->route('penilaian.index')->with('error', $e->getMessage());
|
||||
return response()->json(['success' => false, 'error' => $e->getMessage()]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,55 +257,59 @@ class PenilaianController extends Controller
|
||||
])->findOrFail($id);
|
||||
|
||||
$idPenilaian = $permohonan->jenis_penilaian_id;
|
||||
$idRegion = $permohonan->region_id;
|
||||
$idRegion = $permohonan->region_id;
|
||||
|
||||
$jenisPenilaian = JenisPenilaian::find($idPenilaian);
|
||||
|
||||
$userTeam = Teams::with(['regions', 'teamsUsers.user'])
|
||||
->whereHas('regions', function ($q) use ($idRegion) {
|
||||
$q->where('id', $idRegion);
|
||||
})
|
||||
->get();
|
||||
$userTeam = Teams::with(['regions', 'teamsUsers.user'])->whereHas('regions', function ($q) use ($idRegion) {
|
||||
$q->where('id', $idRegion);
|
||||
})->get();
|
||||
|
||||
$teamPenilai = $userTeam->flatMap(function ($team) {
|
||||
return $team->teamsUsers->filter(function ($teamUser) {
|
||||
return $teamUser->user->roles->contains(function ($role) {
|
||||
return $role->name === 'surveyor' || $role->name === 'surveyor-penilai';
|
||||
return $role->name === 'surveyor' || $role->name === 'penilai' || $role->name === 'administrator';
|
||||
});
|
||||
})->map(function ($teamUser) {
|
||||
return $teamUser->user;
|
||||
});
|
||||
})->unique('id');
|
||||
|
||||
$existingTeamIds = $teamPenilai->pluck('id')->toArray();
|
||||
$existingTeamIds = $userTeam->pluck('id')->toArray();
|
||||
|
||||
$updateTeamPenilai = Teams::with(['regions', 'teamsUsers', 'teamsUsers.user'])
|
||||
->whereNotIn('id', $existingTeamIds)
|
||||
->get();
|
||||
$updateTeamPenilai = Teams::with(['regions', 'teamsUsers', 'teamsUsers.user'])->whereNotIn(
|
||||
'id',
|
||||
$existingTeamIds,
|
||||
)->get();
|
||||
|
||||
$regionName = null;
|
||||
foreach ($userTeam as $item) {
|
||||
$regionName = $item->regions;
|
||||
}
|
||||
// $regionName = $userTeam->first()?->regions->name;
|
||||
|
||||
|
||||
|
||||
$penilaian = Penilaian::where('nomor_registrasi', $permohonan->nomor_registrasi)->first();
|
||||
|
||||
|
||||
$penilaianTeam = collect();
|
||||
if ($penilaian && $penilaian->id) {
|
||||
$penilaianTeam = PenilaianTeam::where('penilaian_id', $penilaian->id)->get();
|
||||
}
|
||||
|
||||
// return response()->json([
|
||||
// 'penilaianTeam' => $penilaianTeam
|
||||
// ]);
|
||||
// dd($penilaianTeam);
|
||||
|
||||
|
||||
return view('lpj::penilaian.form', compact('permohonan', 'teamPenilai', 'jenisPenilaian', 'penilaian', 'regionName', 'updateTeamPenilai', 'penilaianTeam'));
|
||||
return view(
|
||||
'lpj::penilaian.form',
|
||||
compact(
|
||||
'permohonan',
|
||||
'teamPenilai',
|
||||
'jenisPenilaian',
|
||||
'penilaian',
|
||||
'regionName',
|
||||
'updateTeamPenilai',
|
||||
'penilaianTeam',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
@@ -259,9 +318,7 @@ class PenilaianController extends Controller
|
||||
{
|
||||
$validatedData = $request->validated();
|
||||
if ($validatedData) {
|
||||
|
||||
try {
|
||||
|
||||
if (isset($validatedData['dokumen']) && $request->hasFile('dokumen')) {
|
||||
$file_name = $validatedData['dokumen']->getClientOriginalName();
|
||||
$validatedData['dokumen']->storeAs('public/dokumen_revisi', $file_name);
|
||||
@@ -269,8 +326,8 @@ class PenilaianController extends Controller
|
||||
|
||||
$dataToUpdate = [
|
||||
'keterangan' => $validatedData['keterangan'],
|
||||
'dokumen' => 'dokumen_revisi/' . $file_name,
|
||||
'status' => 'revisi',
|
||||
'dokumen' => 'dokumen_revisi/' . $file_name,
|
||||
'status' => 'revisi',
|
||||
];
|
||||
|
||||
|
||||
@@ -285,12 +342,9 @@ class PenilaianController extends Controller
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
|
||||
}
|
||||
|
||||
$query = Permohonan::query();
|
||||
@@ -308,10 +362,15 @@ class PenilaianController extends Controller
|
||||
});
|
||||
}
|
||||
|
||||
$query->whereRaw('LOWER(status) = ?', ['registered']);
|
||||
$query->whereHas('region.teams.teamsUsers.user', function ($q) {
|
||||
$q->where('id', Auth::user()->id);
|
||||
});
|
||||
$query->whereIn('status', ['registered', 'registrasi-final', 'reassign']);
|
||||
|
||||
|
||||
if (Auth::user()->roles[0]->name !== 'administrator') {
|
||||
|
||||
$query->whereHas('region.teams.teamsUsers.user', function ($q) {
|
||||
$q->where('id', Auth::user()->id);
|
||||
});
|
||||
}
|
||||
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
@@ -334,7 +393,10 @@ class PenilaianController extends Controller
|
||||
}
|
||||
|
||||
$filteredRecords = $query->count();
|
||||
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'region.teams.teamsUsers.user'])->get();
|
||||
$data = $query->with(
|
||||
['user', 'debiture', 'branch', 'tujuanPenilaian', 'jenisPenilaian', 'region.teams.teamsUsers.user',
|
||||
]
|
||||
)->get();
|
||||
|
||||
$pageCount = ceil($totalRecords / $size);
|
||||
|
||||
@@ -351,70 +413,301 @@ class PenilaianController extends Controller
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public function otorisator(Request $request)
|
||||
{
|
||||
$type = $request->route('type');
|
||||
$headers = [
|
||||
'pelaporan' => 'Pelaporan',
|
||||
'pembayaran' => 'Pembayaran',
|
||||
'pembatalan' => 'Pembatalan',
|
||||
'sla' => 'SLA',
|
||||
'paparan' => 'Paparan'
|
||||
];
|
||||
|
||||
$type = $request->route('type');
|
||||
$header = '';
|
||||
$regions = Regions::all();
|
||||
|
||||
switch ($type) {
|
||||
case 'pelaporan':
|
||||
$header = 'Pelaporan';
|
||||
break;
|
||||
case 'pembayaran':
|
||||
$header = 'Pembayaran';
|
||||
break;
|
||||
case 'pembatalan':
|
||||
$header = 'Pembatalan';
|
||||
break;
|
||||
case 'sla':
|
||||
$header = 'SLA';
|
||||
break;
|
||||
$header = $headers[$type] ?? 'Pelaporan';
|
||||
|
||||
switch ($header) {
|
||||
case 'SLA':
|
||||
return view('lpj::penilaian.otorisator.index-sla', compact('header'));
|
||||
case 'Paparan':
|
||||
return view('lpj::penilaian.paparan-so', compact('header'));
|
||||
default:
|
||||
$header = 'Pelaporan';
|
||||
break;
|
||||
return view('lpj::penilaian.otorisator.index', compact('header', 'regions'));
|
||||
}
|
||||
|
||||
return view('lpj::penilaian.otorisator.index', compact('header'));
|
||||
}
|
||||
|
||||
public function show($id)
|
||||
public function show($id, $type)
|
||||
{
|
||||
$headers = [
|
||||
'Pelaporan' => 'Pelaporan',
|
||||
'Pembayaran' => 'Pembayaran',
|
||||
'Pembatalan' => 'Pembatalan',
|
||||
'SLA' => 'SLA',
|
||||
'Paparan' => 'Paparan'
|
||||
];
|
||||
|
||||
$header = $headers[$type] ?? 'Pelaporan';
|
||||
$authorization = null;
|
||||
if ($header === 'SLA') {
|
||||
$authorization = Authorization::with(['user','permohonan.lampiranDokumen.jenisLampiran'])->find($id);
|
||||
$permohonan = Permohonan::with(['lampiranDokumen.jenisLampiran'])->find($authorization->permohonan_id);
|
||||
} else {
|
||||
$permohonan = Permohonan::with(['lampiranDokumen.jenisLampiran'])->find($id);
|
||||
}
|
||||
if ($header === 'SLA') {
|
||||
return view('lpj::penilaian.otorisator.sla', compact('permohonan', 'header', 'authorization'));
|
||||
}
|
||||
if ($header === 'Paparan') {
|
||||
$authorization = Authorization::with(['user'])->where('permohonan_id', $id)->first();
|
||||
return view('lpj::penilaian.otorisator.show', compact('permohonan', 'header', 'authorization'));
|
||||
}
|
||||
return view('lpj::penilaian.otorisator.show', compact('permohonan', 'header', 'authorization'));
|
||||
}
|
||||
|
||||
public function otorisatorUpdate(Request $request, $id, $context)
|
||||
{
|
||||
if ($context === 'Freze SLA' || $context === 'Unfreeze SLA') {
|
||||
$authorization = Authorization::with(['user'])->find($id);
|
||||
if (!$authorization) {
|
||||
return response()->json([
|
||||
'message' => 'Data authorization SLA tidak ditemukan.',
|
||||
], 404);
|
||||
}
|
||||
$permohonan = Permohonan::find($authorization->permohonan_id);
|
||||
} elseif ($context === 'Paparan') {
|
||||
$authorization = Authorization::with(['user'])->find($id);
|
||||
if (!$authorization) {
|
||||
return response()->json([
|
||||
'message' => 'Data authorization Paparan tidak ditemukan.',
|
||||
], 404);
|
||||
}
|
||||
$permohonan = Permohonan::find($authorization->permohonan_id);
|
||||
} else {
|
||||
$permohonan = Permohonan::find($id);
|
||||
}
|
||||
|
||||
if (!$permohonan) {
|
||||
return response()->json([
|
||||
'message' => 'Data permohonan tidak ditemukan.',
|
||||
], 404);
|
||||
}
|
||||
|
||||
switch (strtolower($context)) {
|
||||
case 'pembayaran':
|
||||
|
||||
$newStatus = $permohonan->status_bayar === 'sudah_bayar' ? 'belum_bayar' : 'sudah_bayar';
|
||||
|
||||
$permohonan->update([
|
||||
'status_bayar' => $newStatus,
|
||||
'keterangan' => $request->keterangan,
|
||||
]);
|
||||
break;
|
||||
|
||||
case 'pembatalan':
|
||||
$permohonan->update([
|
||||
'status' => 'batal',
|
||||
'keterangan' => $request->keterangan,
|
||||
]);
|
||||
break;
|
||||
|
||||
case 'pelaporan':
|
||||
$role = Auth::user()->roles[0]->name;
|
||||
$status = 'done';
|
||||
$approvalField = null;
|
||||
|
||||
$lpj_ = optional(json_decode($permohonan->penilai->lpj));
|
||||
$npw = $lpj_->total_nilai_pasar_wajar ?? 0;
|
||||
$npw = str_replace('.', '', $npw);
|
||||
|
||||
|
||||
if ($role === 'senior-officer') {
|
||||
$approvalField = 'approval_so';
|
||||
$status = $npw <=1000000000 ? 'done' : 'proses-laporan';
|
||||
} elseif ($role === 'EO Appraisal') {
|
||||
$approvalField = 'approval_eo';
|
||||
$status = $npw <=5000000000 ? 'done' : 'proses-laporan';
|
||||
} elseif ($role === 'DD Appraisal') {
|
||||
$approvalField = 'approval_dd';
|
||||
$status = 'done';
|
||||
}
|
||||
|
||||
if ($status == 'done' && $permohonan->status_bayar === 'sudah_bayar' && $permohonan->penilai->type_penilai === 'standar' || $permohonan->penilai->type_penilai === 'sederhana') {
|
||||
$_permohonan = Permohonan::with(['documents.jenisJaminan','penilaian._user_penilai','penilai','documents.detail.jenisLegalitasJaminan'])->find($permohonan->id);
|
||||
|
||||
if (isset($_permohonan->penilai->lpj)) {
|
||||
$npw = json_decode($_permohonan->penilai->lpj, true);
|
||||
$npw = $npw['total_nilai_pasar_wajar'] ?? 0;
|
||||
}
|
||||
|
||||
$dataAdk = [
|
||||
'debiture_id' => $_permohonan->debiture_id,
|
||||
'jenis_agunan' => $_permohonan->documents->pluck('jenisJaminan.name')->unique()->implode(', '),
|
||||
'alamat_agunan' => $_permohonan->documents->map(function ($document) {
|
||||
return formatAlamat($document);
|
||||
})->unique()->implode(', '),
|
||||
'nama_pemilik' => $_permohonan->documents->pluck('pemilik.name')->unique()->implode(', '),
|
||||
'tanggal_kunjungan' => $_permohonan->penilaian->tanggal_kunjungan,
|
||||
'nama_penilai' => $_permohonan->penilaian->_user_penilai->userPenilaiTeam->name,
|
||||
'nilai_likuidasi' => $_permohonan->nilai_liquidasi,
|
||||
'nilai_pasar_wajar' => str_replace('.', '', $npw),
|
||||
'bukti_kepemilikan' => $_permohonan->documents->flatMap(function ($document) {
|
||||
return $document->detail->map(function ($detail) {
|
||||
return $detail->jenisLegalitasJaminan->name ?? null;
|
||||
});
|
||||
})->filter()->unique()->implode(', '),
|
||||
|
||||
];
|
||||
LaporanAdminKredit::create($dataAdk);
|
||||
}
|
||||
|
||||
if ($approvalField) {
|
||||
$this->updatePermohonan($permohonan, $status, $approvalField, $request->keterangan);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'freze sla':
|
||||
if (Auth::user()->roles[0]->name === 'senior-officer' || Auth::user()->roles[0]->name === 'administrator' && $authorization->approve_so === null) {
|
||||
$authorization->update([
|
||||
'status' => '3',
|
||||
'status_so' => '1',
|
||||
'approve_so' => Auth::user()->id,
|
||||
'approve_so_at' => now(),
|
||||
'keterangan_so' => $request->message,
|
||||
]);
|
||||
} elseif (Auth::user()->roles[0]->name === 'EO Appraisal' || Auth::user()->roles[0]->name === 'administrator' && $authorization->approve_so && $authorization->approve_eo === null) {
|
||||
$status = '2';
|
||||
if (in_array($permohonan->nilai_plafond_id, [1, 2])) {
|
||||
$status = '1';
|
||||
$permohonan->update([
|
||||
'status' => $authorization->request
|
||||
]);
|
||||
}
|
||||
|
||||
$authorization->update([
|
||||
'status' => $status,
|
||||
'status_eo' => '1',
|
||||
'approve_eo' => Auth::user()->id,
|
||||
'approve_eo_at' => now(),
|
||||
'keterangan_eo' => $request->message,
|
||||
]);
|
||||
} elseif (Auth::user()->roles[0]->name === 'DD Appraisal' || Auth::user()->roles[0]->name === 'administrator' && $authorization->approve_so && $authorization->approve_eo && $authorization->approve_dd === null) {
|
||||
$authorization->update([
|
||||
'status' => '1',
|
||||
'status_dd' => '1',
|
||||
'approve_dd' => Auth::user()->id,
|
||||
'approve_dd_at' => now(),
|
||||
'keterangan_dd' => $request->message,
|
||||
]);
|
||||
|
||||
$permohonan->update([
|
||||
'status' => $authorization->request
|
||||
]);
|
||||
}
|
||||
break;
|
||||
case 'paparan':
|
||||
if (Auth::user()->roles[0]->name === 'senior-officer' || Auth::user()->roles[0]->name === 'administrator' && $authorization->approve_so === null) {
|
||||
$status = '3';
|
||||
if (in_array($permohonan->nilai_plafond_id, [3])) {
|
||||
$status = '1';
|
||||
$permohonan->update([
|
||||
'status' => $authorization->request
|
||||
]);
|
||||
}
|
||||
$authorization->update([
|
||||
'status' => $status,
|
||||
'status_so' => '1',
|
||||
'approve_so' => Auth::user()->id,
|
||||
'approve_so_at' => now(),
|
||||
'keterangan_so' => $request->keterangan,
|
||||
]);
|
||||
|
||||
$permohonan->update([
|
||||
'tanggal_paparan' => $request->tanggalPaparan,
|
||||
'keterangan' => $request->keterangan
|
||||
]);
|
||||
|
||||
} elseif (Auth::user()->roles[0]->name === 'EO Appraisal') {
|
||||
$status = '2';
|
||||
if (in_array($permohonan->nilai_plafond_id, [1,2, 3])) {
|
||||
$status = '1';
|
||||
$permohonan->update([
|
||||
'status' => $authorization->request
|
||||
]);
|
||||
}
|
||||
$authorization->update([
|
||||
'status' => $status,
|
||||
'status_eo' => '1',
|
||||
'approve_eo' => Auth::user()->id,
|
||||
'approve_eo_at' => now(),
|
||||
'keterangan_eo' => $request->keterangan,
|
||||
]);
|
||||
} elseif (Auth::user()->roles[0]->name === 'DD Appraisal' || Auth::user()->roles[0]->name === 'administrator' && $authorization->approve_so && $authorization->approve_dd === null) {
|
||||
$authorization->update([
|
||||
'status' => '1',
|
||||
'status_dd' => '1',
|
||||
'approve_dd' => Auth::user()->id,
|
||||
'approve_dd_at' => now(),
|
||||
'keterangan_dd' => $request->keterangan,
|
||||
]);
|
||||
|
||||
$permohonan->update([
|
||||
'status' => 'paparan'
|
||||
]);
|
||||
}
|
||||
break;
|
||||
case 'unfreeze sla':
|
||||
$authorization->update([
|
||||
'request' => 'unfreeze-sla',
|
||||
]);
|
||||
$permohonan->update([
|
||||
'status' => 'unfreeze-sla',
|
||||
]);
|
||||
break;
|
||||
|
||||
default:
|
||||
return response()->json([
|
||||
'message' => 'Konteks otorisasi tidak valid.',
|
||||
], 400);
|
||||
}
|
||||
|
||||
|
||||
return response()->json([
|
||||
'message' => 'Otorisasi berhasil dilakukan.',
|
||||
'data' => $permohonan,
|
||||
]);
|
||||
}
|
||||
|
||||
public function updatePermohonan($permohonan, $status, $approvalField, $message)
|
||||
{
|
||||
|
||||
$permohonan = Permohonan::find($id);
|
||||
|
||||
return view('lpj::penilaian.otorisator.show', compact('permohonan'));
|
||||
$permohonan->update([
|
||||
'status' => $status,
|
||||
$approvalField => Auth::user()->id,
|
||||
"{$approvalField}_at" => now(),
|
||||
'keterangan' => $message,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function dataForAuthorization(Request $request, $otorisator)
|
||||
{
|
||||
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
// abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
|
||||
$status = '';
|
||||
|
||||
switch ($otorisator) {
|
||||
case 'Pelaporan':
|
||||
$status = 'proses paparan';
|
||||
break;
|
||||
case 'Pembayaran':
|
||||
$status = 'proses';
|
||||
break;
|
||||
case 'Pembatalan':
|
||||
$status = 'order';
|
||||
break;
|
||||
default:
|
||||
$status = '';
|
||||
break;
|
||||
}
|
||||
// Tentukan status berdasarkan otorisator
|
||||
$status = match ($otorisator) {
|
||||
'Pelaporan' => 'proses-laporan',
|
||||
'Pembayaran' => 'proses',
|
||||
'Pembatalan' => 'batal',
|
||||
'SLA' => 'request-freeze',
|
||||
'Paparan' => 'proses-paparan',
|
||||
default => '',
|
||||
};
|
||||
|
||||
|
||||
$query = Permohonan::query();
|
||||
@@ -422,6 +715,7 @@ class PenilaianController extends Controller
|
||||
// Pencarian berdasarkan parameter search
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
@@ -429,6 +723,7 @@ class PenilaianController extends Controller
|
||||
$q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('region', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
@@ -437,11 +732,41 @@ class PenilaianController extends Controller
|
||||
if (!empty($otorisator)) {
|
||||
if ($status == 'proses') {
|
||||
$query->whereIn('status_bayar', ['sudah_bayar', 'belum_bayar']);
|
||||
} else {
|
||||
} elseif ($status == 'proses-laporan') {
|
||||
$query->whereRaw('LOWER(status) = ?', [strtolower($status)]);
|
||||
} elseif ($status == 'batal') {
|
||||
$query->whereRaw('LOWER(status) = ?', [strtolower($status)]);
|
||||
} elseif ($status == 'request-freeze') {
|
||||
$query->whereRaw('LOWER(status) = ?', [strtolower($status)]);
|
||||
} elseif ($status == 'proses-paparan') {
|
||||
$query->whereRaw('LOWER(status) IN (?, ?)', ['proses-paparan', 'paparan']);
|
||||
}
|
||||
}
|
||||
|
||||
// Filter berdasarkan region user yang login
|
||||
// if ($status == 'proses-laporan') {
|
||||
// $requestedRegion = $request->get('search');
|
||||
|
||||
// if ($requestedRegion) {
|
||||
// $query->whereHas('region', function ($q) use ($requestedRegion) {
|
||||
// $q->where('name', $requestedRegion);
|
||||
// });
|
||||
// } else {
|
||||
// $query->whereHas('region.teams.teamsUsers', function ($q) {
|
||||
// $q->where('user_id', Auth::id());
|
||||
// });
|
||||
// }
|
||||
// } else {
|
||||
if (Auth::user()->hasRole('senior-officer')) {
|
||||
$query->whereHas('region.teams.teamsUsers', function ($q) {
|
||||
$q->where('user_id', Auth::id());
|
||||
});
|
||||
}
|
||||
// }
|
||||
|
||||
|
||||
|
||||
|
||||
// Sorting berdasarkan sortField dan sortOrder
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
@@ -469,7 +794,25 @@ class PenilaianController extends Controller
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Ambil data dengan relasi
|
||||
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get();
|
||||
$data = $query->with([
|
||||
'user',
|
||||
'debiture',
|
||||
'branch',
|
||||
'tujuanPenilaian',
|
||||
'nilaiPlafond',
|
||||
'penilaian.userPenilai' => function ($q) {
|
||||
$q->where('role', 'penilai')->with(['user', 'team.regions']);
|
||||
},
|
||||
'penilai',
|
||||
'approveSo',
|
||||
'approveEo',
|
||||
'approveDd',
|
||||
'authorization.approveSo',
|
||||
'authorization.approveEo',
|
||||
'authorization.approveDd'
|
||||
])->get();
|
||||
|
||||
|
||||
|
||||
// Hitung jumlah halaman
|
||||
$pageCount = ceil($totalRecords / $size);
|
||||
@@ -489,5 +832,191 @@ class PenilaianController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
public function view_laporan(Request $request)
|
||||
{
|
||||
|
||||
$id = $request->permohonanId;
|
||||
$documentId = $request->query('documentId');
|
||||
$jaminanId = $request->query('jaminanId');
|
||||
|
||||
$permohonan = $this->surveyorController->getPermohonanJaminanId($id, $documentId, $jaminanId);
|
||||
$basicData = $this->surveyorController->getCommonData();
|
||||
$provinces = Province::all();
|
||||
$inspeksi = Inspeksi::where('permohonan_id', $id)->where('dokument_id', $documentId)->first();
|
||||
$lpj = Penilai::where('permohonan_id', $id)
|
||||
->where('dokument_id', $documentId)
|
||||
->first();
|
||||
$penilai = $lpj;
|
||||
|
||||
$forminspeksi = null;
|
||||
$lpjData = null;
|
||||
if ($inspeksi) {
|
||||
$forminspeksi = json_decode($inspeksi->data_form, true);
|
||||
}
|
||||
$nomorLaporan = $this->penilaiController->generateNoLaporan($permohonan, $documentId, $lpj->type_penilai);
|
||||
|
||||
|
||||
$formFoto = $formPeta = $cities = $districts = $villages = $memo = null;
|
||||
|
||||
if ($lpj) {
|
||||
$lpjData = json_decode($lpj->lpj, true);
|
||||
$resumeData = json_decode($lpj->resume, true);
|
||||
$callReport = json_decode($lpj->call_report, true);
|
||||
if (isset($lpj->memo)) {
|
||||
$memo = json_decode($lpj->memo);
|
||||
}
|
||||
if (isset($memo->lokasi->province_code)) {
|
||||
$cities = City::where('province_code', $memo->lokasi->province_code)->get();
|
||||
}
|
||||
|
||||
if (isset($memo->lokasi->city_code)) {
|
||||
$districts = District::where('city_code', $memo->lokasi->city_code)->get();
|
||||
}
|
||||
|
||||
if (isset($memo->lokasi->district_code)) {
|
||||
$villages = Village::where('district_code', $memo->lokasi->district_code)->get();
|
||||
}
|
||||
$rap = json_decode($lpj->rap, true);
|
||||
}
|
||||
|
||||
if (empty($lpj->type_penilai)) {
|
||||
return redirect()->back()->with('error', 'Masih diproses');
|
||||
}
|
||||
|
||||
$viewLaporan = $this->getViewLaporan($lpj->type_penilai);
|
||||
|
||||
if (empty($viewLaporan)) {
|
||||
return redirect()->back()->with('error', 'Laporan belum dibuat');
|
||||
}
|
||||
|
||||
return view('lpj::' . $viewLaporan, compact('permohonan', 'forminspeksi', 'basicData', 'inspeksi', 'lpjData', 'provinces', 'resumeData', 'rap', 'memo', 'cities', 'districts', 'villages', 'formFoto', 'formPeta', 'nomorLaporan', 'penilai', 'callReport'));
|
||||
}
|
||||
|
||||
private function getViewLaporan($tipe)
|
||||
{
|
||||
$viewMap = [
|
||||
'sederhana' => 'penilai.components.lpj-sederhana-standar',
|
||||
'standar' => 'penilai.components.lpj-sederhana-standar',
|
||||
'resume' => 'penilai.components.resume',
|
||||
'memo' => 'penilai.components.memo',
|
||||
'rap' => 'penilai.components.rap-penilai',
|
||||
'call-report' => 'penilai.components.call-report',
|
||||
];
|
||||
return $viewMap[$tipe] ?? '';
|
||||
}
|
||||
|
||||
public function storePenilaiLaporan(Request $request)
|
||||
{
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
|
||||
$validatedRequest = app(FormSurveyorRequest::class);
|
||||
$this->surveyorController->store($validatedRequest);
|
||||
|
||||
$data = [
|
||||
'luas_tanah_penilai' => $request->input('luas_tanah_penilai'),
|
||||
'nilai_tanah_1' => $request->input('nilai_tanah_1'),
|
||||
'nilai_tanah_2' => $request->input('nilai_tanah_2'),
|
||||
'luas_bangunan_penilai' => $request->input('luas_bangunan_penilai'),
|
||||
'nilai_bangunan_1' => $request->input('nilai_bangunan_1'),
|
||||
'nilai_bangunan_2' => $request->input('nilai_bangunan_2'),
|
||||
'sarana_pelengkap_penilai' => $request->input('sarana_pelengkap_penilai'),
|
||||
'nilai_sarana_pelengkap_1' => $request->input('nilai_sarana_pelengkap_1'),
|
||||
'nilai_sarana_pelengkap_2' => $request->input('nilai_sarana_pelengkap_2'),
|
||||
'total_nilai_pasar_wajar' => $request->input('total_nilai_pasar_wajar'),
|
||||
'likuidasi' => $request->input('likuidasi'),
|
||||
'likuidasi_nilai_1' => $request->input('likuidasi_nilai_1'),
|
||||
'likuidasi_nilai_2' => $request->input('likuidasi_nilai_2'),
|
||||
'asuransi_luas_bangunan' => $request->input('asuransi_luas_bangunan'),
|
||||
'asuransi_nilai_1' => $request->input('asuransi_nilai_1'),
|
||||
'asuransi_nilai_2' => $request->input('asuransi_nilai_2'),
|
||||
];
|
||||
|
||||
// Update atau buat data baru
|
||||
Penilai::updateOrCreate(
|
||||
[
|
||||
'permohonan_id' => $request->permohonanId,
|
||||
'dokument_id' => $request->documentId,
|
||||
|
||||
],
|
||||
[
|
||||
'lpj' => json_encode($data),
|
||||
]
|
||||
);
|
||||
DB::commit();
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Berhasil Update Laporan penilai',
|
||||
'data' => $request->all(),
|
||||
], 200);
|
||||
} catch (\Throwable $e) {
|
||||
DB::rollBack();
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Terjadi kesalahan',
|
||||
'error' => $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
public function revisiLaporan(Request $request, $id)
|
||||
{
|
||||
// dd($id);
|
||||
if ($request->dataHeader == 'Paparan' || $request->dataHeader == 'Freze SLA') {
|
||||
$authorization = Authorization::find($id);
|
||||
$permohonan = Permohonan::find($authorization->permohonan_id);
|
||||
} else {
|
||||
$permohonan = Permohonan::find($id);
|
||||
$userRole = Auth::user()->roles[0]->name;
|
||||
}
|
||||
|
||||
if ($permohonan->status === 'proses-paparan') {
|
||||
if ($authorization) {
|
||||
$authorization->delete();
|
||||
}
|
||||
|
||||
$status = 'revisi-paparan';
|
||||
} elseif ($permohonan->status === 'request-freeze') {
|
||||
if ($authorization) {
|
||||
$authorization->delete();
|
||||
}
|
||||
|
||||
$status = 'reject-freeze';
|
||||
} elseif ($permohonan->status === 'proses-laporan' && $userRole === 'senior-officer') {
|
||||
$status = 'revisi-laporan';
|
||||
} elseif ($permohonan->status === 'proses-laporan' && $userRole === 'EO Appraisal') {
|
||||
$permohonan->update([
|
||||
'approval_so' => 0,
|
||||
'approval_so_at' => null,
|
||||
]);
|
||||
$status = 'revisi-laporan';
|
||||
} elseif ($permohonan->status === 'proses-laporan' && $userRole === 'DD Appraisal') {
|
||||
$permohonan->update([
|
||||
'approval_so' => 0,
|
||||
'approval_so_at' => null,
|
||||
'approval_eo' => 0,
|
||||
'approval_eo_at' => null,
|
||||
|
||||
]);
|
||||
$status = 'revisi-laporan';
|
||||
} else {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Tidak ada tindakan yang dapat dilakukan untuk status saat ini.',
|
||||
], 400);
|
||||
}
|
||||
|
||||
// Perbarui status dan informasi lainnya
|
||||
$permohonan->update([
|
||||
'status' => $status,
|
||||
'keterangan' => $request->keterangan,
|
||||
'submitted_at' => now(),
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Berhasil Revisi Laporan penilai.',
|
||||
], 200);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,9 +3,11 @@
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Barryvdh\DomPDF\Facade\Pdf;
|
||||
use Exception;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Location\Models\City;
|
||||
use Modules\Location\Models\District;
|
||||
@@ -18,13 +20,26 @@
|
||||
use Modules\Lpj\Models\DokumenJaminan;
|
||||
use Modules\Lpj\Models\JenisFasilitasKredit;
|
||||
use Modules\Lpj\Models\NilaiPlafond;
|
||||
use Modules\Lpj\Models\Penilaian;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\PermohonanPembatalan;
|
||||
use Modules\Lpj\Models\PersetujuanPenawaran;
|
||||
use Modules\Lpj\Models\StatusPermohonan;
|
||||
use Modules\Lpj\Models\TujuanPenilaian;
|
||||
use Modules\Lpj\Services\PermohonanHistoryService;
|
||||
use Modules\Lpj\Models\Noc;
|
||||
|
||||
|
||||
|
||||
class PermohonanController extends Controller
|
||||
{
|
||||
public $user;
|
||||
public $user;
|
||||
protected $historyService;
|
||||
|
||||
public function __construct(PermohonanHistoryService $historyService)
|
||||
{
|
||||
$this->historyService = $historyService;
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
@@ -35,9 +50,42 @@
|
||||
{
|
||||
$validate = $request->validated();
|
||||
if ($validate) {
|
||||
if(auth()->user()->hasRole('admin')){
|
||||
$validate['status'] = "preregister";
|
||||
}
|
||||
try {
|
||||
// Process file upload
|
||||
$filePath = null;
|
||||
if ($request->hasFile('attachment')) {
|
||||
$file = $request->file('attachment');
|
||||
$fileName = time() . '_' . $file->getClientOriginalName();
|
||||
$filePath = $file->storeAs('permohonan_attachments', $fileName, 'public');
|
||||
}
|
||||
|
||||
// Get keterangan if provided
|
||||
$keterangan = $request->input('keterangan') ?? null;
|
||||
|
||||
|
||||
// Save to database
|
||||
Permohonan::create($validate);
|
||||
$permohonan = Permohonan::create($validate);
|
||||
|
||||
// Create history
|
||||
$this->historyService->createHistory(
|
||||
$permohonan,
|
||||
$validate['status'],
|
||||
$keterangan,
|
||||
[], // beforeRequest is empty for new permohonan
|
||||
$permohonan->toArray(),
|
||||
$filePath,
|
||||
);
|
||||
|
||||
$documents = DokumenJaminan::where('permohonan_id', $permohonan->id)->get();
|
||||
if (count($documents) < 1) {
|
||||
return redirect()->route(
|
||||
'debitur.jaminan.create',
|
||||
array_merge(['permohonan_id' => $permohonan->id], ['id' => $permohonan->debiture->id]),
|
||||
)->with('success', 'Permohonan created successfully, Lengkapi data jaminan terlebih dahulu');
|
||||
}
|
||||
return redirect()
|
||||
->route('permohonan.index')->with('success', 'Permohonan created successfully');
|
||||
} catch (Exception $e) {
|
||||
@@ -105,27 +153,6 @@
|
||||
);
|
||||
}
|
||||
|
||||
public function update(PermohonanRequest $request, $id)
|
||||
{
|
||||
$validate = $request->validated();
|
||||
if ($validate) {
|
||||
try {
|
||||
// Update in database
|
||||
$permohonan = Permohonan::find($id);
|
||||
if ($permohonan->status == 'revisi') {
|
||||
$validate['status'] = 'order';
|
||||
}
|
||||
|
||||
$permohonan->update($validate);
|
||||
return redirect()
|
||||
->route('permohonan.index')->with('success', 'Permohonan updated successfully');
|
||||
} catch (Exception $e) {
|
||||
return redirect()
|
||||
->route('permohonan.edit', $id)->with('error', 'Failed to update permohonan');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function destroy($id)
|
||||
{
|
||||
try {
|
||||
@@ -148,6 +175,126 @@
|
||||
// Retrieve data from the database
|
||||
$query = Permohonan::query();
|
||||
|
||||
if (!Auth::user()->hasAnyRole(['administrator','admin'])) {
|
||||
$query = $query->where('branch_id', Auth::user()->branch_id);
|
||||
}
|
||||
|
||||
$query = $query->orderBy('nomor_registrasi', 'desc');
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('mig_mst_lpj_nomor_jaminan', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
$size = $request->get('size', 10);
|
||||
if ($size == 0) {
|
||||
$size = 10;
|
||||
}
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->get();
|
||||
|
||||
$data = $data->map(function ($item) {
|
||||
return [
|
||||
'id' => $item->id,
|
||||
'nomor_registrasi' => $item->nomor_registrasi,
|
||||
'mig_mst_lpj_nomor_jaminan' => $item->mig_mst_lpj_nomor_jaminan,
|
||||
'tanggal_permohonan' => $item->tanggal_permohonan ? dateFormat(
|
||||
$item->tanggal_permohonan,
|
||||
) : null,
|
||||
'pemohon' => $item->user->name ?? 'N/A',
|
||||
'branch' => $item->branch->name ?? 'N/A',
|
||||
'debiture' => [
|
||||
'name' => $item->debiture->name,
|
||||
],
|
||||
'tujuan_penilaian' => [
|
||||
'code' => $item->tujuanPenilaian->code ?? null,
|
||||
'name' => $item->tujuanPenilaian->name ?? null,
|
||||
],
|
||||
'status' => $item->status,
|
||||
'documents' => count($item->documents),
|
||||
'keterangan' => $item->keterangan,
|
||||
'penilaian' => [
|
||||
'id' => $item->penilaian->id ?? null,
|
||||
'waktu_penilaian' => $item->penilaian->waktu_penilaian ?? null,
|
||||
'rejected_note' => $item->penilaian->rejected_note ?? null,
|
||||
'authorized_status' => $item->penilaian->authorized_status ?? null,
|
||||
],
|
||||
'registrasi_catatan' => $item->registrasi_catatan,
|
||||
];
|
||||
});
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $size);
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = max(1, $request->get('page', 1));
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function export()
|
||||
{
|
||||
return Excel::download(new PermohonanExport(), 'permohonan.xlsx');
|
||||
}
|
||||
|
||||
public function authorization()
|
||||
{
|
||||
return view('lpj::permohonan.authorization.index');
|
||||
}
|
||||
|
||||
public function dataForAuthorization(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = Permohonan::query()->with('documents')->has('documents', '>', 0)->where('status', '=', 'order');
|
||||
|
||||
if (!Auth::user()->hasAnyRole(['administrator'])) {
|
||||
$query = $query->where('branch_id', Auth::user()->branch_id);
|
||||
}
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
@@ -205,83 +352,6 @@
|
||||
]);
|
||||
}
|
||||
|
||||
public function export()
|
||||
{
|
||||
return Excel::download(new PermohonanExport, 'permohonan.xlsx');
|
||||
}
|
||||
|
||||
public function authorization()
|
||||
{
|
||||
return view('lpj::permohonan.authorization.index');
|
||||
}
|
||||
|
||||
public function dataForAuthorization(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = Permohonan::query();
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->where('status', '=', 'order')->get(
|
||||
);
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = 0 + 1;
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function showAuthorization($id)
|
||||
{
|
||||
$permohonan = Permohonan::find($id);
|
||||
@@ -295,6 +365,55 @@
|
||||
$permohonan->status = $request->status;
|
||||
$permohonan->keterangan = $request->keterangan;
|
||||
$permohonan->save();
|
||||
|
||||
if ($permohonan->status_bayar == 'belum_bayar') {
|
||||
PersetujuanPenawaran::firstOrCreate(
|
||||
['permohonan_id' => $id],
|
||||
['created_by' => Auth::id()]
|
||||
);
|
||||
}
|
||||
|
||||
if ($permohonan->status == 'sudah_dibayar') {
|
||||
|
||||
$documents = $permohonan->dokumenjaminan->first(function ($doc) {
|
||||
return $doc->detail && $doc->detail->contains('name', 'Bukti Bayar');
|
||||
});
|
||||
|
||||
$buktiBayar = $documents->detail->filter(function ($detail) {
|
||||
return $detail->name == 'Bukti Bayar';
|
||||
})->first() ?? null;
|
||||
|
||||
if ($buktiBayar->isEmpty()) {
|
||||
return redirect()->route('authorization.show', $id)->with('error', 'Bukti Bayar harus diunggah');
|
||||
}
|
||||
|
||||
$dokumenJaminan = json_decode($buktiBayar->dokumen_jaminan);
|
||||
|
||||
$persetujuanPenawaran = PersetujuanPenawaran::firstOrCreate(
|
||||
['permohonan_id' => $id],
|
||||
[
|
||||
'created_by' => Auth::id(),
|
||||
'bukti_bayar' => $buktiBayar->first()->dokumen_jaminan[0],
|
||||
]
|
||||
);
|
||||
|
||||
try {
|
||||
Noc::updateOrCreate([
|
||||
'permohonan_id' => $persetujuanPenawaran->permohonan_id,
|
||||
'persetujuan_penawaran_id' => $persetujuanPenawaran->id
|
||||
],[
|
||||
'bukti_bayar' => $persetujuanPenawaran->bukti_bayar,
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
\Log::error('Failed to create or update NOC: ' . $e->getMessage());
|
||||
return redirect()
|
||||
->route('persetujuan-penawaran.index')
|
||||
->with('error', 'Persetujuan Penawaran berhasil disimpan tetapi gagal membuat NOC: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
} catch (Exception $e) {
|
||||
return redirect()->route('authorization.show', $id)->with('error', 'Failed to update permohonan');
|
||||
}
|
||||
@@ -317,4 +436,139 @@
|
||||
// $pdf = Pdf::loadView('lpj::permohonan.print', compact('permohonan'));
|
||||
// return $pdf->stream();
|
||||
}
|
||||
|
||||
public function showPembatalan($id)
|
||||
{
|
||||
$permohonan = Permohonan::with(['pembatalan', 'debiture'])->findOrFail($id);
|
||||
return view('lpj::permohonan.pembatalan-form', compact('permohonan'));
|
||||
}
|
||||
|
||||
public function pembatalan(Request $request)
|
||||
{
|
||||
// Validate the request
|
||||
$validatedData = $request->validate([
|
||||
'permohonan_id' => 'required|exists:permohonan,id',
|
||||
'alasan_pembatalan' => 'required|string',
|
||||
'file_pembatalan' => 'required|file|mimes:pdf,doc,docx|max:2048',
|
||||
]);
|
||||
|
||||
// Handle file upload
|
||||
if ($request->hasFile('file_pembatalan')) {
|
||||
$file = $request->file('file_pembatalan');
|
||||
$filename = time() . '_' . $file->getClientOriginalName();
|
||||
$filePath = $file->storeAs('pembatalan', $filename, 'public');
|
||||
$validatedData['file_pembatalan'] = $filePath;
|
||||
}
|
||||
|
||||
// Add created_by
|
||||
$validatedData['created_by'] = auth()->id();
|
||||
|
||||
// Create new PermohonanPembatalan
|
||||
$pembatalan = PermohonanPembatalan::create($validatedData);
|
||||
|
||||
return redirect()->route('permohonan.index')->with('success', 'Pembatalan Permohonan Menunggu Approval');
|
||||
}
|
||||
|
||||
public function storeAproved(Request $request, $id)
|
||||
: JsonResponse {
|
||||
$data = [];
|
||||
if (request()->ajax()) {
|
||||
try {
|
||||
$penilaian = Penilaian::findOrFail($id);
|
||||
$penilaian->update([
|
||||
'authorized_status' => 1,
|
||||
]);
|
||||
|
||||
$permohonan = Permohonan::findOrFail($request->permohonan_id);
|
||||
|
||||
$permohonan->update([
|
||||
'status' => 'proses-survey',
|
||||
]);
|
||||
|
||||
$data['status'] = 'success';
|
||||
$data['message'] = 'Jadwal ' . $request->noReg . ' berhasil di aprove';
|
||||
} catch (Exception $e) {
|
||||
$data['status'] = 'error';
|
||||
$data['message'] = 'Gagal membuat jadwal: ' . $e->getMessage();
|
||||
}
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['message'] = "no ajax request";
|
||||
}
|
||||
|
||||
return response()->json($data);
|
||||
}
|
||||
|
||||
public function update(PermohonanRequest $request, $id)
|
||||
{
|
||||
$permohonan = Permohonan::findOrFail($id);
|
||||
$beforeRequest = $permohonan->toArray();
|
||||
|
||||
$validate = $request->validated();
|
||||
if ($validate) {
|
||||
try {
|
||||
// Update in database
|
||||
|
||||
if ($permohonan->status == 'revisi') {
|
||||
$validate['status'] = 'order';
|
||||
}
|
||||
$permohonan->update($validate);
|
||||
|
||||
$documents = DokumenJaminan::where('permohonan_id', $permohonan->id)->get();
|
||||
if (count($documents) < 1) {
|
||||
return redirect()->route(
|
||||
'debitur.jaminan.create',
|
||||
array_merge(['permohonan_id' => $permohonan->id], ['id' => $permohonan->debiture->id]),
|
||||
)->with('success', 'Permohonan created successfully, Lengkapi data jaminan terlebih dahulu');
|
||||
}
|
||||
|
||||
return redirect()
|
||||
->route('permohonan.index')->with('success', 'Permohonan updated successfully');
|
||||
} catch (Exception $e) {
|
||||
return redirect()
|
||||
->route('permohonan.edit', $id)->with('error', 'Failed to update permohonan');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function storeRescheduleSurvey(Request $request, $id)
|
||||
{
|
||||
try {
|
||||
$validatedData = $request->validate([
|
||||
'permohonan_id' => 'required|exists:permohonan,id',
|
||||
'penilaian_id' => 'nullable',
|
||||
'nomor_registrasi' => 'required',
|
||||
'reschedule_note' => 'required',
|
||||
'reschedule_date' => 'required',
|
||||
'keterangan' => 'required',
|
||||
]);
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
$permohonan = Permohonan::findOrFail($request->permohonan_id);
|
||||
$permohonan->update([
|
||||
'status' => 'request-reschedule',
|
||||
]);
|
||||
|
||||
$penilaian = Penilaian::findOrFail($id);
|
||||
|
||||
$penilaian->update([
|
||||
'reschedule_date' => $request->reschedule_date,
|
||||
'reschedule_note' => $request->reschedule_note,
|
||||
]);
|
||||
|
||||
DB::commit();
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'message' => 'Proses request reschedule permohonan Nomor registrasi ' . $request->nomor_registrasi . ' berhasil',
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'Gagal membuat request reschedule: ' . $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
261
app/Http/Controllers/PersetujuanPenawaranController.php
Normal file
261
app/Http/Controllers/PersetujuanPenawaranController.php
Normal file
@@ -0,0 +1,261 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Modules\Lpj\Http\Requests\PersetujuanPenawaranRequest;
|
||||
use Modules\Lpj\Models\Noc;
|
||||
use Modules\Lpj\Models\PenawaranDetailTender;
|
||||
use Modules\Lpj\Models\PenawaranDetailTenderLog;
|
||||
use Modules\Lpj\Models\PenawaranTender;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\PersetujuanPenawaran;
|
||||
|
||||
class PersetujuanPenawaranController extends Controller
|
||||
{
|
||||
public $user;
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$persetujuanPenawarans = PersetujuanPenawaran::all();
|
||||
return view('lpj::persetujuan_penawaran.index', compact('persetujuanPenawarans'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(PersetujuanPenawaranRequest $request)
|
||||
{
|
||||
$validated = $request->validated();
|
||||
$validated['created_by'] = Auth::id();
|
||||
$validated['status'] = '0';
|
||||
$validated['nominal_bayar'] = $validated['biaya_final'];
|
||||
|
||||
$persetujuanPenawaran = PersetujuanPenawaran::updateOrCreate(
|
||||
['penawaran_id' => $validated['penawaran_id']],
|
||||
$validated,
|
||||
);
|
||||
|
||||
$folderPath = 'persetujuan_penawaran/' . $validated['penawaran_id'];
|
||||
|
||||
if ($request->hasFile('file_persetujuan_penawaran')) {
|
||||
$persetujuanPenawaran->file_persetujuan_penawaran = $request->file('file_persetujuan_penawaran')->store(
|
||||
$folderPath,
|
||||
'public',
|
||||
);
|
||||
}
|
||||
|
||||
if ($request->hasFile('surat_representasi')) {
|
||||
$persetujuanPenawaran->surat_representasi = $request->file('surat_representasi')->store(
|
||||
$folderPath,
|
||||
'public',
|
||||
);
|
||||
}
|
||||
|
||||
if ($request->hasFile('bukti_bayar')) {
|
||||
$persetujuanPenawaran->bukti_bayar = $request->file('bukti_bayar')->store($folderPath, 'public');
|
||||
}
|
||||
|
||||
$persetujuanPenawaran->save();
|
||||
|
||||
|
||||
// Save NOC
|
||||
try {
|
||||
$noc = Noc::updateOrCreate([
|
||||
'permohonan_id' => $persetujuanPenawaran->permohonan_id,
|
||||
'persetujuan_penawaran_id' => $persetujuanPenawaran->id
|
||||
],[
|
||||
'bukti_bayar' => $persetujuanPenawaran->bukti_bayar,
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
\Log::error('Failed to create or update NOC: ' . $e->getMessage());
|
||||
return redirect()
|
||||
->route('persetujuan-penawaran.index')
|
||||
->with('error', 'Persetujuan Penawaran berhasil disimpan tetapi gagal membuat NOC: ' . $e->getMessage());
|
||||
}
|
||||
|
||||
return redirect()
|
||||
->route('persetujuan-penawaran.index')->with('success', 'Persetujuan Penawaran berhasil disimpan.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(PersetujuanPenawaranRequest $request, PersetujuanPenawaran $persetujuanPenawaran)
|
||||
{
|
||||
$validated = $request->validated();
|
||||
$validated['updated_by'] = Auth::id();
|
||||
|
||||
$persetujuanPenawaran->update($validated);
|
||||
|
||||
return redirect()
|
||||
->route('persetujuan-penawaran.index')->with('success', 'Persetujuan Penawaran updated successfully');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
return view('lpj::persetujuan_penawaran.create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
$permohonan = Permohonan::find($id);
|
||||
$permohonan->status = 'tender';
|
||||
$dataDetailPenawaranLog = [];
|
||||
|
||||
// andy add update status penawaran
|
||||
// update detail_penawaran => detail_penawaran.status = 1 (untuk all KJPP)
|
||||
// update penawaran => penawaran.status ="tender", penawaran.updated_at, penawaran.updated_by
|
||||
// update permohonan => permohonan.status ="tender", permohonan.updated_at, permohonan.updated_by
|
||||
// insert detail_permohonan_log
|
||||
$penawaran = PenawaranTender::where('nomor_registrasi', $permohonan->nomor_registrasi)->first();
|
||||
// dd($penawaran->id);
|
||||
PenawaranDetailTender::where('penawaran_id', $penawaran->id)->update([
|
||||
'status' => 1,
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
PenawaranTender::where('id', $penawaran->id)->update([
|
||||
'status' => 'tender',
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
$detailPenawaran = PenawaranDetailTender::where('penawaran_id', $penawaran->id)->distinct()->get();
|
||||
|
||||
// log
|
||||
if (sizeof($detailPenawaran) > 0) {
|
||||
foreach ($detailPenawaran as $model) {
|
||||
array_push($dataDetailPenawaranLog, [
|
||||
'detail_penawaran_id' => $model->id,
|
||||
'kjpp_rekanan_id' => $model->kjpp_rekanan_id,
|
||||
'penawaran_id' => $model->penawaran_id,
|
||||
'no_proposal' => $model->no_proposal,
|
||||
'tgl_proposal' => $model->tgl_proposal,
|
||||
'biaya_penawaran' => $model->biaya_penawaran,
|
||||
'attachment' => $model->attachment,
|
||||
'dokumen_persetujuan' => $model->dokumen_persetujuan,
|
||||
'status' => $model->status,
|
||||
'authorized_status' => $model->authorized_status,
|
||||
'authorized_at' => $model->authorized_at,
|
||||
'authorized_at' => $model->authorized_at,
|
||||
'created_at' => $model->created_at,
|
||||
'updated_at' => $model->updated_at,
|
||||
'deleted_at' => $model->deleted_at,
|
||||
'created_by' => $model->created_by,
|
||||
'updated_by' => $model->updated_by,
|
||||
'deleted_by' => $model->deleted_by,
|
||||
]);
|
||||
}
|
||||
|
||||
PenawaranDetailTenderLog::insert($dataDetailPenawaranLog);
|
||||
}
|
||||
// log
|
||||
// andy add update status penawaran
|
||||
|
||||
return $permohonan->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
$permohonan = Permohonan::with(['debiture', 'penawaranTender.detail'])->find($id);
|
||||
$persetujuanPenawaran = PersetujuanPenawaran::where('permohonan_id', $id)->first();
|
||||
return view('lpj::persetujuan_penawaran.form', compact('permohonan', 'persetujuanPenawaran'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(PersetujuanPenawaran $persetujuanPenawaran)
|
||||
{
|
||||
$persetujuanPenawaran->delete();
|
||||
|
||||
return redirect()
|
||||
->route('persetujuan-penawaran.index')->with('success', 'Persetujuan Penawaran deleted successfully');
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('persetujuan_penawaran.view')) {
|
||||
//abort(403, 'Sorry! You are not allowed to view persetujuan penawaran.');
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
//$query = Permohonan::query()->where(['status' => 'persetujuan-penawaran']);
|
||||
$query = Permohonan::query()
|
||||
->where(['status' => 'persetujuan-penawaran'])
|
||||
->whereHas('penawaranTender', function ($q) {
|
||||
$q->where('status', 'persetujuan-penawaran');
|
||||
});
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', "%$search%");
|
||||
});
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->with(['debiture', 'penawaranTender.detail', 'penawaranTender.persetujuan'])->get();
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = $request->get('page', 1);
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ namespace Modules\Lpj\Http\Controllers;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Carbon\Carbon;
|
||||
use Exception;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
@@ -12,11 +13,17 @@ use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Modules\Lpj\Http\Requests\ProsesPenawaranRequest;
|
||||
use Modules\Lpj\Models\JenisLaporan;
|
||||
use Modules\Lpj\Models\KJPP;
|
||||
use Modules\Lpj\Models\PenawaranDetailTender;
|
||||
use Modules\Lpj\Models\PenawaranDetailTenderLog;
|
||||
use Modules\Lpj\Models\PenawaranTender;
|
||||
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\StatusPermohonan;
|
||||
use Modules\Lpj\Models\TujuanPenilaian;
|
||||
use Modules\Lpj\Models\TujuanPenilaianKJPP;
|
||||
|
||||
class ProsesPenawaranController extends Controller
|
||||
{
|
||||
@@ -38,16 +45,60 @@ class ProsesPenawaranController extends Controller
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = PenawaranTender::query()->where('status', '=', 'tender')->withCount('penawarandetails');
|
||||
// $query = PenawaranTender::query()->whereIn('status', ['tender', 'proposal-tender'])->withCount('penawarandetails');
|
||||
|
||||
// penawaran need union with permohonan
|
||||
$query = PenawaranTender::query()->whereIn('penawaran.status', ['tender', 'proposal-tender'])
|
||||
->select('penawaran.id',
|
||||
'penawaran.nomor_registrasi',
|
||||
'penawaran.code as penawaran_code',
|
||||
'penawaran.start_date',
|
||||
'penawaran.end_date',
|
||||
'penawaran.status as statusnya',
|
||||
'debitures.name as debitures_name',
|
||||
'permohonan.tanggal_permohonan',
|
||||
'users.name as user_pemohon',
|
||||
'branches.name as branches_name',
|
||||
'tujuan_penilaian.name as tujuan_penilaian_name',
|
||||
'tujuan_penilaian_kjpp.name as tujuan_penilaian_kjpp_name'
|
||||
)
|
||||
->withCount('penawarandetails')
|
||||
->leftJoin('permohonan', 'permohonan.nomor_registrasi', '=', 'penawaran.nomor_registrasi')
|
||||
->leftJoin('users', 'users.id', '=', 'permohonan.user_id')
|
||||
->leftJoin('branches', 'branches.id', '=', 'permohonan.branch_id')
|
||||
->leftJoin('tujuan_penilaian', 'tujuan_penilaian.id','=','permohonan.tujuan_penilaian_id')
|
||||
->leftJoin('debitures', 'debitures.id', '=', 'permohonan.debiture_id')
|
||||
->leftJoin('tujuan_penilaian_kjpp', 'tujuan_penilaian_kjpp.id', '=', 'penawaran.tujuan_penilaian_kjpp_id');
|
||||
|
||||
$permohonanQuery = Permohonan::whereIn('permohonan.status', ['registered'])->where('permohonan.jenis_penilaian_id', '=', 2)
|
||||
->select('permohonan.id',
|
||||
'permohonan.nomor_registrasi',
|
||||
DB::raw('"" as penawaran_code'),
|
||||
DB::raw('"" as start_date'),
|
||||
DB::raw('"" as end_date'),
|
||||
'permohonan.status as statusnya',
|
||||
'debitures.name as debitures_name',
|
||||
'permohonan.tanggal_permohonan',
|
||||
'users.name as user_pemohon',
|
||||
'branches.name as branches_name',
|
||||
'tujuan_penilaian.name as tujuan_penilaian_name',
|
||||
DB::raw('"" as tujuan_penilaian_kjpp_name'),
|
||||
DB::raw('"-" as penawarandetails_count'))
|
||||
->leftJoin('users', 'users.id', '=', 'permohonan.user_id')
|
||||
->leftJoin('branches', 'branches.id', '=', 'permohonan.branch_id')
|
||||
->leftJoin('debitures', 'debitures.id', '=', 'permohonan.debiture_id')
|
||||
->leftJoin('tujuan_penilaian', 'tujuan_penilaian.id','=','permohonan.tujuan_penilaian_id');
|
||||
$query->union($permohonanQuery);
|
||||
// penawaran need union with permohonan
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('tujuanPenilaianKJPP', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
$q->where('penawaran.nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
//$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
//$q->orWhereRelation('tujuanPenilaianKJPP', 'name', 'LIKE', '%' . $search . '%');
|
||||
//$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
@@ -74,8 +125,29 @@ class ProsesPenawaranController extends Controller
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page
|
||||
//$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get();
|
||||
$data = $query->with(['tujuanPenilaianKjpp','permohonan','permohonan.debiture'])->get();
|
||||
// $data = $query->with(['tujuanPenilaianKjpp','permohonan','permohonan.debiture'])->get();
|
||||
$data = $query->get();
|
||||
|
||||
// format date
|
||||
$i = 0;
|
||||
foreach ($data as $obj) {
|
||||
|
||||
// tanggal_permohonan
|
||||
if ($obj->tanggal_permohonan) {
|
||||
$data[$i]->tanggal_permohonan = Carbon::parse($obj->tanggal_permohonan)->format('d M Y');
|
||||
}
|
||||
|
||||
// date_range
|
||||
$data[$i]->date_range = "-";
|
||||
if ($obj->start_date && $obj->end_date)
|
||||
{
|
||||
$data[$i]->date_range = Carbon::parse($obj->start_date)->format('d M Y') . ' - ' .
|
||||
Carbon::parse($obj->end_date)->format('d M Y');
|
||||
}
|
||||
|
||||
$i++;
|
||||
}
|
||||
// format date
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
@@ -97,6 +169,7 @@ class ProsesPenawaranController extends Controller
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
// $id => penawaran.id
|
||||
return view('lpj::prosespenawaran.edit', compact('id'));
|
||||
}
|
||||
|
||||
@@ -108,7 +181,7 @@ class ProsesPenawaranController extends Controller
|
||||
|
||||
if (request()->ajax()) {
|
||||
$id = $request->id;
|
||||
$penawaran = PenawaranTender::find($id);
|
||||
$penawaran = PenawaranTender::with('permohonan.debiture')->find($id);
|
||||
$penawrandetails = PenawaranDetailTender::where('penawaran_id','=',$id)
|
||||
->leftJoin('kjpp', 'kjpp.id', '=', 'detail_penawaran.kjpp_rekanan_id')
|
||||
->select('detail_penawaran.*', 'kjpp.code AS kjpp_code', 'kjpp.name AS kjpp_name')
|
||||
@@ -126,7 +199,18 @@ class ProsesPenawaranController extends Controller
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
|
||||
DB::enableQueryLog();
|
||||
$kjpps = KJPP::whereNotIn('id', function($query) use ($id) {
|
||||
$query->select('kjpp_rekanan_id')
|
||||
->from('detail_penawaran')
|
||||
->where('penawaran_id', '=', $id)
|
||||
->where('status','=',1); // status=1 (masih aktif)
|
||||
})
|
||||
->select('id', 'name', 'code') // Pilih beberapa kolom sekaligus
|
||||
->get();
|
||||
$sql=DB::getQueryLog();
|
||||
$data['sql'] = $sql;
|
||||
$data['kjpps'] = $kjpps;
|
||||
$data['penawaran'] = $penawaran;
|
||||
$data['penawrandetails'] = $penawrandetails;
|
||||
$data['status'] = 'success';
|
||||
@@ -150,23 +234,26 @@ class ProsesPenawaranController extends Controller
|
||||
*/
|
||||
public function update(Request $request, $id): JsonResponse
|
||||
{
|
||||
// $id => detail_penawaran.id
|
||||
// init
|
||||
$data = array();
|
||||
$dataPenawaranDetail = array();
|
||||
if (request()->ajax()) {
|
||||
$validator = ProsesPenawaranController::rulesEditnya($request, $id);
|
||||
|
||||
if ($validator['fails']) {
|
||||
$data['message'] = $validator['errors'];
|
||||
$data['status'] = 'error';
|
||||
}
|
||||
else
|
||||
$penawarandetail = PenawaranDetailTender::find($id);
|
||||
// cek masa aktif penawaran
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($penawarandetail->penawaran_id);
|
||||
// cek status (penawaran.status = tender)
|
||||
$penawaran = PenawaranTender::find($penawarandetail->penawaran_id);
|
||||
if($checkActiveDateRange && ('tender'==$penawaran->status))
|
||||
{
|
||||
try {
|
||||
|
||||
$dataPenawaranDetail = ['updated_by' => Auth::id(),
|
||||
'updated_at' => now(),
|
||||
'biaya_penawaran' => str_replace(".","",$request->biaya_penawaran)
|
||||
'updated_at' => now(),
|
||||
'no_proposal' => $request->no_proposal,
|
||||
'tgl_proposal' => $request->tgl_proposal,
|
||||
'biaya_penawaran' => str_replace(".","",$request->biaya_penawaran)
|
||||
];
|
||||
|
||||
if ($request->hasFile('dokumen_persetujuan'))
|
||||
@@ -186,13 +273,6 @@ class ProsesPenawaranController extends Controller
|
||||
$newFileNameWithPath = $folderPath . $newFileName;
|
||||
$dataPenawaranDetail['attachment'] = $myFile;
|
||||
$dataPenawaranDetail['dokumen_persetujuan'] = $newFileNameWithPath;
|
||||
|
||||
$penawarandetail = PenawaranDetailTender::findOrFail($id);
|
||||
$penawarandetail->update($dataPenawaranDetail);
|
||||
|
||||
$data['detailpenawaran_id'] = $id;
|
||||
$data['status'] = 'success';
|
||||
$data['message'] ['message_success'] = array('Proses Penawarn KJPP successfully');
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -200,19 +280,24 @@ class ProsesPenawaranController extends Controller
|
||||
$data['message'] ['check_file_jenis'] = array("Silahkan upload file pdf");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['check_file'] = array("Silahkan upload file");
|
||||
|
||||
}
|
||||
$penawarandetail = PenawaranDetailTender::findOrFail($id);
|
||||
$penawarandetail->update($dataPenawaranDetail);
|
||||
|
||||
$data['detailpenawaran_id'] = $id;
|
||||
$data['status'] = 'success';
|
||||
$data['message'] ['message_success'] = array('Proses Penawarn KJPP successfully');
|
||||
} catch (Exception $e) {
|
||||
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_error_try_catch'] = array('Proses Penawarn KJPP failed.');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message']['active_date_range'] = array("Penawaran sudah di tutup");
|
||||
}
|
||||
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
@@ -250,15 +335,17 @@ class ProsesPenawaranController extends Controller
|
||||
*/
|
||||
public function updateAll(Request $request, $id): JsonResponse
|
||||
{
|
||||
// $id = penawaran.id
|
||||
// init
|
||||
$data = array();
|
||||
$dataPermohonan = array();
|
||||
$dataPenawaran = array();
|
||||
$penawaran = PenawaranTender::find($id);
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($id);
|
||||
|
||||
// cek masa aktif penawaran
|
||||
if($checkActiveDateRange)
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($id);
|
||||
// cek status (penawaran.status = tender)
|
||||
$penawaran = PenawaranTender::find($id);
|
||||
if($checkActiveDateRange && ('tender'==$penawaran->status))
|
||||
{
|
||||
|
||||
$checkKelengkapanDetailKJPP = checkKelengkapanDetailKJPP($id);
|
||||
@@ -307,27 +394,41 @@ class ProsesPenawaranController extends Controller
|
||||
|
||||
public function updateKJPPStatus(Request $request, $id): JsonResponse
|
||||
{
|
||||
// $id => detail_penawaran.id
|
||||
// init
|
||||
$data = array();
|
||||
$dataDetailPenawaran = array();
|
||||
|
||||
try {
|
||||
$detailpenawaran = PenawaranDetailTender::findOrFail($id);
|
||||
$data['id']=$id;
|
||||
$detailpenawaran = PenawaranDetailTender::find($id);
|
||||
// cek masa aktif penawaran
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($detailpenawaran->penawaran_id);
|
||||
// cek status (penawaran.status = tender)
|
||||
$penawaran = PenawaranTender::find($detailpenawaran->penawaran_id);
|
||||
if($checkActiveDateRange && ('tender'==$penawaran->status))
|
||||
{
|
||||
try {
|
||||
|
||||
$dataDetailPenawaran = ['status' => '0',
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
];
|
||||
// $data['id']=$id;
|
||||
|
||||
$detailpenawaran->update($dataDetailPenawaran);
|
||||
$dataDetailPenawaran = ['status' => '0',
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
];
|
||||
|
||||
$data['status'] = 'success';
|
||||
$data['message'] ['message_success'] = array('Sukses delete Penawaran KJPP '.$request->kjppName);
|
||||
} catch (Exception $e) {
|
||||
$detailpenawaran->update($dataDetailPenawaran);
|
||||
|
||||
$data['status'] = 'success';
|
||||
$data['message'] ['message_success'] = array('Sukses delete Penawaran KJPP '.$request->kjppName);
|
||||
} catch (Exception $e) {
|
||||
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_error'] = array("Gagal delete Penawaran KJPP ".$request->kjppName);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_error_try_catch'] = array("Gagal delete Penawaran KJPP ".$request->kjppName);
|
||||
$data['message']['message_error'] = array("Penawaran sudah di tutup");
|
||||
}
|
||||
|
||||
return response()->json($data);
|
||||
@@ -336,6 +437,596 @@ class ProsesPenawaranController extends Controller
|
||||
public function show($id)
|
||||
{
|
||||
$prosespenawaran = PenawaranTender::find($id);
|
||||
return view('lpj::prosespenawaran.show', compact('id', 'prosespenawaran'));
|
||||
$permohonan = "";
|
||||
if($prosespenawaran){
|
||||
$permohonan = Permohonan::where('nomor_registrasi',$prosespenawaran->nomor_registrasi)->first();
|
||||
}
|
||||
return view('lpj::prosespenawaran.show', compact('id', 'prosespenawaran','permohonan'));
|
||||
}
|
||||
|
||||
public function updateDraft(Request $request, $id): JsonResponse
|
||||
{
|
||||
// $id = penawaran.id
|
||||
// init
|
||||
$data = array();
|
||||
$dataPenawaranDetail = array();
|
||||
$failed = 0;
|
||||
|
||||
// cek masa aktif penawaran
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($id);
|
||||
// cek status (penawaran.status = tender)
|
||||
$penawaran = PenawaranTender::find($id);
|
||||
if($checkActiveDateRange && ('tender'==$penawaran->status))
|
||||
{
|
||||
DB::beginTransaction();
|
||||
try
|
||||
{
|
||||
// update detail_penawaran
|
||||
$detail_penawaran_ids = $request->input('prosespenawaran_penawarandetail_id', []);
|
||||
$no_proposals = $request->input('prosespenawaran_no_proposal', []);
|
||||
$tgl_proposals = $request->input('prosespenawaran_tgl_proposal', []);
|
||||
$biaya_penawarans = $request->input('prosespenawaran_biayaPenawaran', []);
|
||||
$dokumen_penawarans = $request->file('prosespenawaran_dokumenPersetujuan');
|
||||
|
||||
$tot_kjpp = sizeof($detail_penawaran_ids);
|
||||
if($tot_kjpp>0)
|
||||
{
|
||||
// loop
|
||||
for($i=0;$i<$tot_kjpp;$i++)
|
||||
{
|
||||
$detail_penawaran_id= $detail_penawaran_ids[$i];
|
||||
$dataPenawaranDetail = [
|
||||
'no_proposal' => $no_proposals[$i],
|
||||
'tgl_proposal' => $tgl_proposals[$i],
|
||||
'biaya_penawaran' => str_replace(".","",$biaya_penawarans[$i]), // 'biaya_penawaran' => str_replace(".","",$request->biaya_penawaran)
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now(),
|
||||
];
|
||||
|
||||
$penawarandetail = PenawaranDetailTender::find($detail_penawaran_id);
|
||||
if ($dokumen_penawarans)
|
||||
{
|
||||
if (is_array($dokumen_penawarans) && array_key_exists($i, $dokumen_penawarans))
|
||||
{
|
||||
$file_tmp = $dokumen_penawarans[$i];
|
||||
if($file_tmp->isValid())
|
||||
{
|
||||
$folderPath = 'uploads/penawaran/';
|
||||
|
||||
$myFile=$file_tmp->getClientOriginalName(); // nama file with extension
|
||||
$file_name = pathinfo($myFile, PATHINFO_FILENAME); // nama file without extension
|
||||
|
||||
$extension = $file_tmp->getClientOriginalExtension();
|
||||
// kjppID_penawaranID_namaFile_userID_time
|
||||
$newFileName = $penawarandetail->kjpp_rekanan_id.'_'.$penawarandetail->penawaran_id.'_'.$file_name.'_'.Auth::user()->id."_".time() .'.'. $extension;
|
||||
Storage::disk('public')->put($folderPath.'/'.$newFileName,file_get_contents($file_tmp));
|
||||
|
||||
$newFileNameWithPath = $folderPath . $newFileName;
|
||||
$dataPenawaranDetail['attachment'] = $myFile;
|
||||
$dataPenawaranDetail['dokumen_persetujuan'] = $newFileNameWithPath;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$checkStatus = $penawarandetail->update($dataPenawaranDetail);
|
||||
if(!$checkStatus)
|
||||
$failed++;
|
||||
}
|
||||
|
||||
if($failed>0)
|
||||
{
|
||||
DB::rollBack();
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_error'] = array('Proses Draft Penawaran KJPP failed');
|
||||
}
|
||||
else
|
||||
{
|
||||
DB::commit();
|
||||
$data['status'] = 'success';
|
||||
$data['message'] ['message_success'] = array('Proses Draft Penawaran KJPP successfully');
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_error'] = array('Data inti tidak ada.');
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
// dd($e);
|
||||
DB::rollBack();
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_error_try_catch'] = array('Proses Draft Penawaran KJPP failed.');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message']['active_date_range'] = array("Penawaran sudah di tutup");
|
||||
}
|
||||
|
||||
return response()->json($data);
|
||||
}
|
||||
|
||||
public function store(Request $request): JsonResponse
|
||||
{
|
||||
// init
|
||||
$data = array();
|
||||
// $data['request']=$request->all();
|
||||
$dataPenawaranDetail = array();
|
||||
// cek masa aktif penawaran
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($request->penawaran_id);
|
||||
// cek status (penawaran.status = tender)
|
||||
$penawaran = PenawaranTender::find($request->penawaran_id);
|
||||
if($checkActiveDateRange && ('tender'==$penawaran->status))
|
||||
{
|
||||
try
|
||||
{
|
||||
$dataPenawaranDetail = [
|
||||
'penawaran_id' => $request->penawaran_id,
|
||||
'kjpp_rekanan_id' => $request->kjpp_id,
|
||||
'created_by' => Auth::id(),
|
||||
'created_at' => Carbon::now()
|
||||
];
|
||||
|
||||
PenawaranDetailTender::create($dataPenawaranDetail);
|
||||
|
||||
$data['status'] = 'success';
|
||||
$data['message'] ['message_success'] = array('Proses Tambah KJPP successfully');
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
// dd($e);
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_error_try_catch'] = array('Proses Tambah KJPP failed.');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message']['active_date_range'] = array("Penawaran sudah di tutup");
|
||||
}
|
||||
|
||||
return response()->json($data);
|
||||
}
|
||||
|
||||
public function editulang($id)
|
||||
{
|
||||
// id ==> penawaran.id
|
||||
return view('lpj::prosespenawaran.editulang', compact('id'));
|
||||
}
|
||||
|
||||
public function setDataUlang(Request $request): JsonResponse
|
||||
{
|
||||
$data = array();
|
||||
$penawaran = array();
|
||||
$penawrandetails = array();
|
||||
|
||||
if (request()->ajax()) {
|
||||
$id = $request->id;
|
||||
$penawaran = PenawaranTender::with('permohonan.debiture')->where('status','=','proposal-tender')->find($id);
|
||||
|
||||
if ($penawaran) {
|
||||
$penawrandetails = PenawaranDetailTender::where('penawaran_id','=',$id)
|
||||
->leftJoin('kjpp', 'kjpp.id', '=', 'detail_penawaran.kjpp_rekanan_id')
|
||||
->select('detail_penawaran.*', 'kjpp.code AS kjpp_code', 'kjpp.name AS kjpp_name')
|
||||
->where('detail_penawaran.status','=',1)
|
||||
->get();
|
||||
|
||||
$i=0;
|
||||
foreach($penawrandetails as $obj)
|
||||
{
|
||||
if($obj->dokumen_persetujuan && Storage::disk('public')->exists($obj->dokumen_persetujuan))
|
||||
{
|
||||
$penawrandetails_path = Storage::url($obj->dokumen_persetujuan);
|
||||
$penawrandetails[$i]['dokumen_persetujuan']=$penawrandetails_path;
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
|
||||
$penawaranString = "";
|
||||
if($penawaran->status)
|
||||
{
|
||||
$penawaranString = convertSlug($penawaran->status);
|
||||
$penawaran->status = $penawaranString;
|
||||
}
|
||||
|
||||
$kjpps = KJPP::whereNotIn('id', function($query) use ($id) {
|
||||
$query->select('kjpp_rekanan_id')
|
||||
->from('detail_penawaran')
|
||||
->where('penawaran_id', '=', $id)
|
||||
->where('status','=',1); // status=1 (masih aktif)
|
||||
})
|
||||
->select('id', 'name', 'code') // Pilih beberapa kolom sekaligus
|
||||
->get();
|
||||
|
||||
$data['kjpps'] = $kjpps;
|
||||
$data['penawaran'] = $penawaran;
|
||||
$data['penawrandetails'] = $penawrandetails;
|
||||
$data['status'] = 'success';
|
||||
$data['message']['message_success'] = array("data successfully found");
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['penawaran'] = null;
|
||||
$data['penawrandetails'] = null;
|
||||
$data['message']['message_data'] = array("data not found");
|
||||
}
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_ajax'] = array("no ajax request");
|
||||
}
|
||||
|
||||
return response()->json($data);
|
||||
}
|
||||
|
||||
public function updateKJPPStatusUlang(Request $request, $id): JsonResponse
|
||||
{
|
||||
// message menggunakan SweetAlert2
|
||||
// init
|
||||
$data = array();
|
||||
$dataDetailPenawaran = array();
|
||||
// cek masa aktif penawaran
|
||||
$detailpenawaran = PenawaranDetailTender::find($id);
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($detailpenawaran->penawaran_id);
|
||||
// cek masa aktif penawaran
|
||||
|
||||
// cek apakah blm di approve (penawaran.status = proposal-tender)
|
||||
$penawaran = PenawaranTender::find($detailpenawaran->penawaran_id);
|
||||
// cek apakah blm di approve (penawaran.status = proposal-tender)
|
||||
if($checkActiveDateRange && ('proposal-tender'==$penawaran->status))
|
||||
{
|
||||
try {
|
||||
|
||||
$data['id']=$id;
|
||||
|
||||
$dataDetailPenawaran = ['status' => '0',
|
||||
'updated_by' => Auth::id(),
|
||||
'updated_at' => now()
|
||||
];
|
||||
|
||||
$detailpenawaran->update($dataDetailPenawaran);
|
||||
|
||||
$data['status'] = 'success';
|
||||
$data['message'] ['message_success'] = array('Sukses delete Penawaran KJPP '.$request->kjppName);
|
||||
} catch (Exception $e) {
|
||||
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_error_try_catch'] = array("Gagal delete Penawaran KJPP ".$request->kjppName);
|
||||
// $data['message']['message_error'] = array("Gagal delete Penawaran KJPP ".$request->kjppName);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message']['active_date_range'] = array("Penawaran sudah di tutup");
|
||||
// $data['message']['message_error'] = array("Penawaran sudah di tutup");
|
||||
}
|
||||
|
||||
return response()->json($data);
|
||||
}
|
||||
|
||||
public function updateulang(Request $request, $id): JsonResponse
|
||||
{
|
||||
// id ==> detail_penawaran.id
|
||||
// init
|
||||
$data = array();
|
||||
$dataDetailPenawaranLog = array();
|
||||
$dataDetailPenawaran = array();
|
||||
$pleaseCommit= true;
|
||||
if (request()->ajax()) {
|
||||
|
||||
$validator = ProsesPenawaranController::rulesEditUlangnya($request, $id);
|
||||
|
||||
if ($validator['fails']) {
|
||||
$data['message'] = $validator['errors'];
|
||||
$data['status'] = 'error';
|
||||
}
|
||||
else
|
||||
{
|
||||
// cek masa aktif penawaran
|
||||
$detailpenawaran = PenawaranDetailTender::find($id);
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($detailpenawaran->penawaran_id);
|
||||
// cek masa aktif penawaran
|
||||
|
||||
// cek apakah blm di approve (penawaran.status = proposal-tender)
|
||||
$penawaran = PenawaranTender::find($detailpenawaran->penawaran_id);
|
||||
// cek apakah blm di approve (penawaran.status = proposal-tender)
|
||||
if($checkActiveDateRange && ('proposal-tender'==$penawaran->status))
|
||||
{
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
|
||||
$dataDetailPenawaranLog = [
|
||||
'detail_penawaran_id' =>$detailpenawaran->id,
|
||||
'kjpp_rekanan_id' =>$detailpenawaran->kjpp_rekanan_id,
|
||||
'penawaran_id' =>$detailpenawaran->penawaran_id,
|
||||
'biaya_penawaran' =>$detailpenawaran->biaya_penawaran,
|
||||
'no_proposal' =>$detailpenawaran->no_proposal,
|
||||
'tgl_proposal' =>$detailpenawaran->tgl_proposal,
|
||||
'attachment' =>$detailpenawaran->attachment,
|
||||
'dokumen_persetujuan' =>$detailpenawaran->dokumen_persetujuan,
|
||||
'status' =>$detailpenawaran->status,
|
||||
'authorized_status' =>$detailpenawaran->authorized_status,
|
||||
'authorized_at' =>$detailpenawaran->authorized_at,
|
||||
'authorized_at' =>$detailpenawaran->authorized_at,
|
||||
'created_at' =>$detailpenawaran->created_at,
|
||||
'updated_at' =>$detailpenawaran->updated_at,
|
||||
'deleted_at' =>$detailpenawaran->deleted_at,
|
||||
'created_by' =>$detailpenawaran->created_by,
|
||||
'updated_by' =>$detailpenawaran->updated_by,
|
||||
'deleted_by' =>$detailpenawaran->deleted_by
|
||||
|
||||
];
|
||||
|
||||
PenawaranDetailTenderLog::create($dataDetailPenawaranLog);
|
||||
|
||||
$biaya_penawaran="";
|
||||
if($request->biaya_penawaran)
|
||||
$biaya_penawaran= str_replace(".","",$request->biaya_penawaran);
|
||||
$dataDetailPenawaran = ['updated_by' => Auth::id(),
|
||||
'updated_at' => now(),
|
||||
'no_proposal' => $request->no_proposal,
|
||||
'tgl_proposal' => $request->tgl_proposal,
|
||||
'biaya_penawaran' => $biaya_penawaran
|
||||
];
|
||||
|
||||
if ($request->hasFile('dokumen_persetujuan'))
|
||||
{
|
||||
$file_tmp = $request->file('dokumen_persetujuan');
|
||||
$folderPath = 'uploads/penawaran/';
|
||||
if ($file_tmp->isValid())
|
||||
{
|
||||
$myFile=$file_tmp->getClientOriginalName(); // nama file with extension
|
||||
$file_name = pathinfo($myFile, PATHINFO_FILENAME); // nama file without extension
|
||||
|
||||
$extension = $file_tmp->getClientOriginalExtension();
|
||||
// kjppID_penawaranID_namaFile_userID_time
|
||||
$newFileName = $request->kjpp_rekanan_id.'_'.$id.'_'.$file_name.'_'.Auth::user()->id."_".time() .'.'. $extension;
|
||||
Storage::disk('public')->put($folderPath.'/'.$newFileName,file_get_contents($file_tmp));
|
||||
|
||||
$newFileNameWithPath = $folderPath . $newFileName;
|
||||
$dataDetailPenawaran['attachment'] = $myFile;
|
||||
$dataDetailPenawaran['dokumen_persetujuan'] = $newFileNameWithPath;
|
||||
}
|
||||
else
|
||||
{
|
||||
$pleaseCommit=false;
|
||||
$data['status'] = 'error';
|
||||
$data['message']['check_file_jenis'] = array("Silahkan upload file pdf");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message']['check_file'] = array("Silahkan upload file");
|
||||
|
||||
}
|
||||
|
||||
$detailpenawaran->update($dataDetailPenawaran);
|
||||
|
||||
if($pleaseCommit)
|
||||
{
|
||||
DB::commit();
|
||||
|
||||
$data['id'] = $id;
|
||||
$data['detailpenawaran'] = $detailpenawaran;
|
||||
$data['status'] = 'success';
|
||||
$data['message']['message_success'] = array('Proses Penawarn KJPP Ulang successfully');
|
||||
}
|
||||
else
|
||||
{
|
||||
DB::rollBack();
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_error'] = array("Proses Penawarn KJPP Ulang failed..");
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_error_try_catch'] = array('Proses Penawarn KJPP Ulang failed.');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message']['active_date_range'] = array("Penawaran sudah di tutup");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_ajax'] = array("no ajax request");
|
||||
}
|
||||
|
||||
return response()->json($data);
|
||||
}
|
||||
|
||||
public function rulesEditUlangnya($request, $id)
|
||||
{
|
||||
$validateIt = [
|
||||
// 'name' diambil dari definisi parameter yang di kirim pada POST Data
|
||||
'no_proposal' => 'required',
|
||||
'tgl_proposal' => 'required',
|
||||
'biaya_penawaran' => 'required',
|
||||
'dokumen_persetujuan' => 'required|file|mimes:pdf'
|
||||
];
|
||||
|
||||
$messageIt = [
|
||||
'no_proposal.required' => 'Silahkan isi No Proposal',
|
||||
'tgl_proposal.required' => 'Silahkan isi Tanggal Penawaran',
|
||||
'biaya_penawaran.required' => 'Silahkan isi Biaya Penawaran',
|
||||
'dokumen_persetujuan.required' => 'Silahkan isi dokumen',
|
||||
'dokumen_persetujuan.file' => 'Silahkan isi file',
|
||||
'dokumen_persetujuan.mimes' => 'Silahkan upload pdf'
|
||||
];
|
||||
|
||||
$validator = Validator::make($request->all(), $validateIt, $messageIt);
|
||||
|
||||
$data['fails'] = $validator->fails();
|
||||
$data['errors'] = $validator->errors();
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function storeUlang(Request $request): JsonResponse
|
||||
{
|
||||
// init
|
||||
$data = array();
|
||||
// $data['request']=$request->all();
|
||||
$dataDetailPenawaran = array();
|
||||
// cek masa aktif penawaran
|
||||
$checkActiveDateRange = checkActiveDateRangePenawaran($request->penawaran_id);
|
||||
// cek masa aktif penawaran
|
||||
|
||||
// cek apakah blm di approve (penawaran.status = proposal-tender)
|
||||
$penawaran = PenawaranTender::find($request->penawaran_id);
|
||||
// cek apakah blm di approve (penawaran.status = proposal-tender)
|
||||
if($checkActiveDateRange && ('proposal-tender'==$penawaran->status))
|
||||
{
|
||||
try
|
||||
{
|
||||
$biaya_penawaran="";
|
||||
if($request->biaya_penawaran)
|
||||
$biaya_penawaran= str_replace(".","",$request->biaya_penawaran);
|
||||
$dataDetailPenawaran = [
|
||||
'kjpp_rekanan_id' => $request->kjpp_rekanan_id,
|
||||
'no_proposal' => $request->no_proposal,
|
||||
'tgl_proposal' => $request->tgl_proposal,
|
||||
'biaya_penawaran' => $biaya_penawaran,
|
||||
'penawaran_id' => $request->penawaran_id,
|
||||
'created_by' => Auth::id(),
|
||||
'created_at' => Carbon::now()
|
||||
];
|
||||
|
||||
if ($request->hasFile('dokumen_persetujuan'))
|
||||
{
|
||||
$file_tmp = $request->file('dokumen_persetujuan');
|
||||
$folderPath = 'uploads/penawaran/';
|
||||
if ($file_tmp->isValid())
|
||||
{
|
||||
$myFile=$file_tmp->getClientOriginalName(); // nama file with extension
|
||||
$file_name = pathinfo($myFile, PATHINFO_FILENAME); // nama file without extension
|
||||
|
||||
$extension = $file_tmp->getClientOriginalExtension();
|
||||
// kjppID_penawaranID_namaFile_userID_time
|
||||
$newFileName = $request->kjpp_rekanan_id.'_'.$request->penawaran_id.'_'.$file_name.'_'.Auth::user()->id."_".time() .'.'. $extension;
|
||||
Storage::disk('public')->put($folderPath.'/'.$newFileName,file_get_contents($file_tmp));
|
||||
|
||||
$newFileNameWithPath = $folderPath . $newFileName;
|
||||
$dataDetailPenawaran['attachment'] = $myFile;
|
||||
$dataDetailPenawaran['dokumen_persetujuan'] = $newFileNameWithPath;
|
||||
}
|
||||
else
|
||||
{
|
||||
$pleaseCommit=false;
|
||||
$data['status'] = 'error';
|
||||
$data['message']['check_file_jenis'] = array("Silahkan upload file pdf");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message']['check_file'] = array("Silahkan upload file");
|
||||
|
||||
}
|
||||
PenawaranDetailTender::create($dataDetailPenawaran);
|
||||
|
||||
$data['status'] = 'success';
|
||||
$data['message'] ['message_success'] = array('Proses Tambah KJPP Ulang successfully');
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
dd($e);
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_error_try_catch'] = array('Proses Tambah KJPP Ulang failed.');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
$data['message']['active_date_range'] = array("Penawaran sudah di tutup");
|
||||
}
|
||||
|
||||
return response()->json($data);
|
||||
}
|
||||
|
||||
// merger permohonan
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function createPenawaran($id)
|
||||
{
|
||||
// id ==> permohonan.id
|
||||
$permohonan = Permohonan::find($id);
|
||||
// dd($permohonan);
|
||||
$status = StatusPermohonan::all();
|
||||
$tujuan_penilaian_kjpp = TujuanPenilaianKJPP::all();
|
||||
$jenis_laporan = JenisLaporan::all();
|
||||
$kjpp = KJPP::all();
|
||||
|
||||
return view('lpj::prosespenawaran.createPenawaran', compact('id', 'status', 'tujuan_penilaian_kjpp', 'jenis_laporan', 'kjpp', 'permohonan'));
|
||||
}
|
||||
|
||||
public function storePenawaran(ProsesPenawaranRequest $request, $id)
|
||||
{
|
||||
$validated = $request->validated();
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
|
||||
$permohonan = Permohonan::find($id);
|
||||
|
||||
$userId = Auth::user()->id;
|
||||
$validated['nomor_registrasi'] = $permohonan->nomor_registrasi;
|
||||
$validated['status'] = 'tender';
|
||||
$validated['updated_by'] = $userId; // Updating the record
|
||||
$validated['end_date'] = $request->input('end_date') . ' 23:59:59';
|
||||
|
||||
$permohonan->update($validated);
|
||||
|
||||
// Adding created_by for the new penawaran record
|
||||
$validated['created_by'] = $userId;
|
||||
$validated['code'] = onLastnumberCodePenawaran();
|
||||
$penawaran = PenawaranTender::create($validated);
|
||||
|
||||
$kjpps = $request->input('kjpp', []);
|
||||
|
||||
foreach ($kjpps as $kjpp) {
|
||||
PenawaranDetailTender::create([
|
||||
'penawaran_id' => $penawaran->id,
|
||||
'kjpp_rekanan_id' => $kjpp,
|
||||
'created_by' => $userId, // Set created_by for details
|
||||
'updated_by' => $userId
|
||||
]);
|
||||
}
|
||||
|
||||
// Commit the transaction
|
||||
DB::commit();
|
||||
|
||||
return redirect()
|
||||
->route('tender.prosespenawaran.index')
|
||||
->with('success', 'Data Penawaran created successfully');
|
||||
} catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
|
||||
return redirect()
|
||||
->route('tender.prosespenawaran.createPenawaran', $id)
|
||||
->with('error', 'Validation failed: ' . $e);
|
||||
}
|
||||
}
|
||||
|
||||
public function showPermohonan($id)
|
||||
{
|
||||
// $id => permohonan.id
|
||||
$permohonan = Permohonan::find($id);
|
||||
return view('lpj::prosespenawaran.showPermohonan', compact('id', 'permohonan'));
|
||||
}
|
||||
// merger permohonan
|
||||
}
|
||||
|
||||
@@ -117,8 +117,8 @@ class ProsesPenawaranUlangController extends Controller
|
||||
$penawrandetails = array();
|
||||
|
||||
if (request()->ajax()) {
|
||||
$id = $request->id;
|
||||
$penawaran = PenawaranTender::where('status','=','proposal-tender')->find($id);
|
||||
$id = $request->id;
|
||||
$penawaran = PenawaranTender::with('permohonan.debiture')->where('status','=','proposal-tender')->find($id);
|
||||
|
||||
if ($penawaran) {
|
||||
$penawrandetails = PenawaranDetailTender::where('penawaran_id','=',$id)
|
||||
|
||||
@@ -4,28 +4,17 @@
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
// use Modules\Location\Models\City;
|
||||
// use Modules\Location\Models\District;
|
||||
// use Modules\Location\Models\Province;
|
||||
// use Modules\Location\Models\Village;
|
||||
// use Modules\Lpj\Exports\DebitureExport;
|
||||
// use Modules\Lpj\Http\Requests\DebitureRequest;
|
||||
// use Modules\Lpj\Http\Requests\DokumenJaminanRequest;
|
||||
// use Modules\Lpj\Models\Branch;
|
||||
// use Modules\Lpj\Models\Debiture;
|
||||
// use Modules\Lpj\Models\DokumenJaminan;
|
||||
// use Modules\Lpj\Models\JenisJaminan;
|
||||
// use Modules\Lpj\Models\JenisLegalitasJaminan;
|
||||
// use Modules\Lpj\Models\PemilikJaminan;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\JenisPenilaian;
|
||||
use Modules\Lpj\Models\Regions;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Models\Debiture;
|
||||
use Modules\Lpj\Models\DokumenJaminan;
|
||||
use Modules\Lpj\Models\JenisPenilaian;
|
||||
use Modules\Lpj\Models\Penilai;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use Modules\Lpj\Models\Regions;
|
||||
|
||||
class RegistrasiController extends Controller
|
||||
{
|
||||
@@ -43,7 +32,9 @@
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = Permohonan::query()->where('status','=','preregister');
|
||||
$query = Permohonan::query()
|
||||
->whereIn('status', ['preregister', 'revisi']);
|
||||
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
@@ -101,152 +92,174 @@
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
return view('lpj::registrasi.edit', compact('id'));
|
||||
}
|
||||
|
||||
public function setData(Request $request): JsonResponse
|
||||
public function setData(Request $request)
|
||||
: JsonResponse
|
||||
{
|
||||
$data = array();
|
||||
$datas = array();
|
||||
$data = [];
|
||||
$datas = [];
|
||||
|
||||
if (request()->ajax()) {
|
||||
$id = $request->id;
|
||||
$id = $request->id;
|
||||
$datas = Permohonan::find($id);
|
||||
|
||||
|
||||
if ($datas) {
|
||||
$jenisPenilaians=null;
|
||||
$regions=null;
|
||||
$regions=Regions::pluck('name', 'id');
|
||||
$jenisPenilaians=JenisPenilaian::pluck('name', 'id');
|
||||
|
||||
$data['status'] = 'success';
|
||||
$data['regions'] = $regions;
|
||||
$data['jenisPenilaians'] = $jenisPenilaians;
|
||||
$data['datas'] = $datas;
|
||||
$data['message'] ['message_success'] = array("data successfully found");
|
||||
$jenisPenilaians = null;
|
||||
$regions = null;
|
||||
$regions = Regions::pluck('name', 'id');
|
||||
$jenisPenilaians = JenisPenilaian::pluck('name', 'id');
|
||||
|
||||
$data['status'] = 'success';
|
||||
$data['regions'] = $regions;
|
||||
$data['jenisPenilaians'] = $jenisPenilaians;
|
||||
$data['datas'] = $datas;
|
||||
$data['message'] ['message_success'] = ["data successfully found"];
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['datas'] = null;
|
||||
$data['message'] ['message_data'] = array("data not found");
|
||||
$data['status'] = 'error';
|
||||
$data['datas'] = null;
|
||||
$data['message'] ['message_data'] = ["data not found"];
|
||||
}
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_ajax'] = array("no ajax request");
|
||||
$data['status'] = 'error';
|
||||
$data['message']['message_ajax'] = ["no ajax request"];
|
||||
}
|
||||
|
||||
return response()->json($data);
|
||||
}
|
||||
|
||||
public function update(Request $request, $id): JsonResponse
|
||||
public function show($id)
|
||||
{
|
||||
$permohonan = Permohonan::find($id);
|
||||
$debitur = Debiture::find($permohonan->debiture_id);
|
||||
$documents = DokumenJaminan::with('pemilik', 'detail')->where('permohonan_id', $id)->get();
|
||||
return view('lpj::registrasi.show', compact('id', 'permohonan', 'documents', 'debitur'));
|
||||
}
|
||||
|
||||
public function storeRevisi(Request $request, $id)
|
||||
{
|
||||
try {
|
||||
$permohonan = Permohonan::find($id);
|
||||
|
||||
$permohonan->update([
|
||||
'status' => 'registered'
|
||||
]);
|
||||
|
||||
return redirect()->route('registrasi.index')->with('success', 'Submit Revision successfully');
|
||||
} catch (Exception $e) {
|
||||
return redirect()
|
||||
->route('registrasi.index')
|
||||
->with('error', 'Failed to create permohonan' . $e->getMessage());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public function update(Request $request, $id)
|
||||
: JsonResponse
|
||||
{
|
||||
// init
|
||||
$data = array();
|
||||
$dataku = array();
|
||||
$data = [];
|
||||
$dataku = [];
|
||||
$tindakan = null;
|
||||
if (request()->ajax()) {
|
||||
$validator = RegistrasiController::rulesEditnya($request, $id);
|
||||
|
||||
|
||||
if ($validator['fails']) {
|
||||
$data['message'] = $validator['errors'];
|
||||
$data['status'] = 'error';
|
||||
}
|
||||
else
|
||||
{
|
||||
$data['status'] = 'error';
|
||||
} else {
|
||||
try {
|
||||
$tindakan = $request->tindakan;
|
||||
$dataku = [
|
||||
'registrasi_by' => Auth::id(),
|
||||
'registrasi_at' => now(),
|
||||
];
|
||||
|
||||
$tindakan=$request->tindakan;
|
||||
$dataku = ['registrasi_by' => Auth::id(),
|
||||
'registrasi_at' => now()
|
||||
];
|
||||
|
||||
if($tindakan==0)
|
||||
{
|
||||
$dataku['jenis_penilaian_id'] =$request->jenis_penilaian;
|
||||
$dataku['region_id'] =$request->region;
|
||||
$dataku['status'] = 'registered';
|
||||
if($request->catatan2)
|
||||
$dataku['registrasi_catatan'] =$request->catatan2;
|
||||
}
|
||||
else
|
||||
{
|
||||
$dataku['registrasi_catatan'] =$request->catatan;
|
||||
$dataku['status'] = 'revisi';
|
||||
if ($tindakan == 0) {
|
||||
$dataku['jenis_penilaian_id'] = $request->jenis_penilaian;
|
||||
$dataku['region_id'] = $request->region;
|
||||
$dataku['status'] = 'registered';
|
||||
if ($request->catatan2) {
|
||||
$dataku['registrasi_catatan'] = $request->catatan2;
|
||||
}
|
||||
} else {
|
||||
$dataku['registrasi_catatan'] = $request->catatan;
|
||||
$dataku['status'] = 'revisi';
|
||||
}
|
||||
|
||||
$data['dataku'] =$dataku;
|
||||
|
||||
$data['dataku'] = $dataku;
|
||||
|
||||
$modal = Permohonan::find($id);
|
||||
|
||||
|
||||
$modal->update($dataku);
|
||||
//
|
||||
$data['status'] = 'success';
|
||||
$data['message'] ['message_success'] = array('Regitrasi '.$modal->nomor_registrasi.' successfully');
|
||||
|
||||
if ($modal && $request->jenis_laporan) {
|
||||
foreach ($modal->documents as $document) {
|
||||
Penilai::updateOrCreate(
|
||||
[
|
||||
'permohonan_id' => $id,
|
||||
'dokument_id' => $document->id
|
||||
],
|
||||
['type' => $request->jenis_laporan]
|
||||
);
|
||||
}
|
||||
}
|
||||
//
|
||||
$data['status'] = 'success';
|
||||
$data['message'] ['message_success'] = ['Regitrasi ' . $modal->nomor_registrasi . ' successfully'];
|
||||
} catch (Exception $e) {
|
||||
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_try_catch'] = array('Regitrasi updated failed.');
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_try_catch'] = ['Regitrasi updated failed.'];
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_ajax'] = array("no ajax request");
|
||||
$data['status'] = 'error';
|
||||
$data['message'] ['message_ajax'] = ["no ajax request"];
|
||||
}
|
||||
|
||||
return response()->json($data);
|
||||
|
||||
}
|
||||
|
||||
public function rulesEditnya($request, $id)
|
||||
{
|
||||
$tindakan=null;
|
||||
$jenis_penilaian=null;
|
||||
$validate_catatan='';
|
||||
$tindakan=$request->tindakan;
|
||||
$jenis_penilaian=$request->jenis_penilaian;
|
||||
|
||||
$tindakan = null;
|
||||
$jenis_penilaian = null;
|
||||
$validate_catatan = '';
|
||||
$tindakan = $request->tindakan;
|
||||
$jenis_penilaian = $request->jenis_penilaian;
|
||||
|
||||
$validateIt = [
|
||||
// 'name' diambil dari definisi parameter yang di kirim pada POST Data
|
||||
'tindakan' => 'required',
|
||||
];
|
||||
|
||||
$messageIt = [
|
||||
'tindakan.required' => 'Silahkan pilih Tindakan'
|
||||
'tindakan.required' => 'Silahkan pilih Tindakan',
|
||||
];
|
||||
|
||||
if($tindakan==0)
|
||||
{
|
||||
$validateIt['jenis_penilaian'] = ['required'];
|
||||
$messageIt ['jenis_penilaian.required']= 'Silahkan pilih Jenis Penilaian';
|
||||
if ($tindakan == 0) {
|
||||
$validateIt['jenis_penilaian'] = ['required'];
|
||||
$messageIt ['jenis_penilaian.required'] = 'Silahkan pilih Jenis Penilaian';
|
||||
|
||||
// INTERNAL
|
||||
if(1==$jenis_penilaian)
|
||||
{
|
||||
$validateIt['region'] = ['required'];
|
||||
$messageIt ['region.required']= 'Silahkan pilih Region';
|
||||
// INTERNAL
|
||||
if (1 == $jenis_penilaian) {
|
||||
$validateIt['region'] = ['required'];
|
||||
$messageIt ['region.required'] = 'Silahkan pilih Region';
|
||||
}
|
||||
}
|
||||
elseif($tindakan==1)
|
||||
{
|
||||
$validateIt['catatan'] = ['required'];
|
||||
$messageIt ['catatan.required']= 'Silahkan isi Catatan';
|
||||
} else if ($tindakan == 1) {
|
||||
$validateIt['catatan'] = ['required'];
|
||||
$messageIt ['catatan.required'] = 'Silahkan isi Catatan';
|
||||
}
|
||||
|
||||
$validator = Validator::make($request->all(), $validateIt, $messageIt);
|
||||
|
||||
$data['fails'] = $validator->fails();
|
||||
$data['fails'] = $validator->fails();
|
||||
$data['errors'] = $validator->errors();
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function show($id)
|
||||
{
|
||||
$permohonan = Permohonan::find($id);
|
||||
return view('lpj::registrasi.show', compact('id','permohonan'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -46,21 +46,19 @@
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = PenawaranTender::with(['permohonan', 'tujuanPenilaianKjpp'])->whereHas(
|
||||
'permohonan',
|
||||
function ($q) {
|
||||
$q->where('status', '=', 'spk');
|
||||
},
|
||||
)->withCount('penawarandetails');
|
||||
$query =PenawaranTender::query()
|
||||
->select('penawaran.*', 'tujuan_penilaian_kjpp.name as tujuan_penilaian_kjpp_name')
|
||||
->leftJoin('tujuan_penilaian_kjpp', 'tujuan_penilaian_kjpp.id','=','penawaran.tujuan_penilaian_kjpp_id')
|
||||
->where('penawaran.status','=','registrasi-final')
|
||||
->withCount('penawarandetails');
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
//$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
//$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
@@ -88,7 +86,7 @@
|
||||
|
||||
// Get the data for the current page
|
||||
//$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get();
|
||||
$data = $query->with(['permohonan'])->get();
|
||||
$data = $query->with(['permohonan.debiture'])->get();
|
||||
// dd($data);
|
||||
$i = 0;
|
||||
foreach ($data as $obj) {
|
||||
@@ -134,10 +132,10 @@
|
||||
public function show($id)
|
||||
{
|
||||
$permohonan = Permohonan::find($id);
|
||||
if ($permohonan->dokumen) {
|
||||
$pdfSPK_path = Storage::url($permohonan->dokumen);
|
||||
$permohonan->dokumen = $pdfSPK_path;
|
||||
$permohonan->dokumen = '| <a download href="' . $pdfSPK_path . '" class="badge badge-sm badge-outline" target="_blank">Dokumen SPK.pdf <i class="ki-filled ki-cloud-download"></i></a>';
|
||||
$document = PenawaranTender::where('nomor_registrasi','=',$permohonan->nomor_registrasi)->first();
|
||||
if ($document) {
|
||||
$pdfSPK_path = Storage::url($document->spk_dokumen_path);
|
||||
$permohonan->pdfSPK_path = '| <a download href="' . $pdfSPK_path . '" class="badge badge-sm badge-outline" target="_blank">Dokumen SPK.pdf <i class="ki-filled ki-cloud-download"></i></a>';
|
||||
}
|
||||
|
||||
return view('lpj::registrasifinal.show', compact('id', 'permohonan'));
|
||||
@@ -145,7 +143,15 @@
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
return view('lpj::registrasifinal.edit', compact('id'));
|
||||
$doc_pdf='';
|
||||
$permohonan = Permohonan::find($id);
|
||||
$document = PenawaranTender::where('nomor_registrasi','=',$permohonan->nomor_registrasi)->first();
|
||||
if ($document) {
|
||||
$pdfSPK_path = Storage::url($document->spk_dokumen_path);
|
||||
$doc_pdf = '<a download href="' . $pdfSPK_path . '" class="badge badge-sm badge-outline" target="_blank">Dokumen SPK.pdf <i class="ki-filled ki-cloud-download"></i></a>';
|
||||
}
|
||||
|
||||
return view('lpj::registrasifinal.edit', compact('id','doc_pdf'));
|
||||
}
|
||||
|
||||
public function setData(Request $request)
|
||||
|
||||
22
app/Http/Controllers/RekapHarianSoController.php
Normal file
22
app/Http/Controllers/RekapHarianSoController.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Models\TujuanPenilaian;
|
||||
|
||||
class RekapHarianSoController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$total_laporan_debitur = 0;
|
||||
$tujuan_penilaian = TujuanPenilaian::all();
|
||||
return view('lpj::rekap-harian-so.index', compact('tujuan_penilaian', 'total_laporan_debitur'));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -4,9 +4,11 @@ namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Models\Authorization;
|
||||
|
||||
class SLAController extends Controller
|
||||
{
|
||||
public $user;
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
@@ -62,4 +64,72 @@ class SLAController extends Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('debitur.view')) {
|
||||
// abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
$query = Authorization::query()->with('permohonan.debiture', 'user', 'approveSo', 'approveEo', 'approveDd')->where('jenis', 'sla')->where('request', 'freeze');
|
||||
|
||||
// Pencarian berdasarkan parameter search
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->orWhereRelation('permohonan', 'nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('permohonan', 'tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhereRelation('permohonan.debiture', 'name', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Sorting berdasarkan sortField dan sortOrder
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
|
||||
// Hitung total records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Pagination (default page size 10)
|
||||
$size = $request->get('size', 10);
|
||||
if ($size == 0) {
|
||||
$size = 10;
|
||||
}
|
||||
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page', 1);
|
||||
$offset = ($page - 1) * $size;
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Filtered records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Ambil data dengan relasi
|
||||
$data = $query->get();
|
||||
|
||||
|
||||
// Hitung jumlah halaman
|
||||
$pageCount = ceil($totalRecords / $size);
|
||||
|
||||
// Ambil current page
|
||||
$currentPage = max(1, $request->get('page', 1));
|
||||
|
||||
// Return JSON response
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
548
app/Http/Controllers/SlikController.php
Normal file
548
app/Http/Controllers/SlikController.php
Normal file
@@ -0,0 +1,548 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Exports\SlikExport;
|
||||
use Modules\Lpj\Imports\SlikImport;
|
||||
use Modules\Lpj\Models\Slik;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
/**
|
||||
* Controller untuk mengelola data Slik
|
||||
*
|
||||
* Menangani operasi CRUD dan import data Slik dari file Excel
|
||||
* dengan fitur server-side processing untuk datatables
|
||||
*
|
||||
* @package Modules\Lpj\Http\Controllers
|
||||
*/
|
||||
class SlikController extends Controller
|
||||
{
|
||||
public $user;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->user = Auth::user();
|
||||
}
|
||||
|
||||
/**
|
||||
* Menampilkan halaman index slik
|
||||
*
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('lpj::slik.index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Menampilkan detail slik
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
$slik = Slik::findOrFail($id);
|
||||
return view('lpj::slik.show', compact('slik'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Data untuk datatables dengan server-side processing
|
||||
*
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
// Authorization check dapat ditambahkan sesuai kebutuhan
|
||||
// if (is_null($this->user)) {
|
||||
// abort(403, 'Unauthorized access.');
|
||||
// }
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = Slik::query();
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('sandi_bank', 'LIKE', "%$search%")
|
||||
->orWhere('no_rekening', 'LIKE', "%$search%")
|
||||
->orWhere('cif', 'LIKE', "%$search%")
|
||||
->orWhere('nama_debitur', 'LIKE', "%$search%")
|
||||
->orWhere('nama_cabang', 'LIKE', "%$search%")
|
||||
->orWhere('jenis_agunan', 'LIKE', "%$search%")
|
||||
->orWhere('nama_pemilik_agunan', 'LIKE', "%$search%")
|
||||
->orWhere('alamat_agunan', 'LIKE', "%$search%")
|
||||
->orWhere('lokasi_agunan', 'LIKE', "%$search%");
|
||||
});
|
||||
}
|
||||
|
||||
// Apply year filter
|
||||
if ($request->has('year') && !empty($request->get('year'))) {
|
||||
$query->byYear($request->get('year'));
|
||||
}
|
||||
|
||||
// Apply month filter
|
||||
if ($request->has('month') && !empty($request->get('month'))) {
|
||||
$query->byMonth($request->get('month'));
|
||||
}
|
||||
|
||||
// Apply sandi bank filter
|
||||
if ($request->has('sandi_bank') && !empty($request->get('sandi_bank'))) {
|
||||
$query->where('sandi_bank', $request->get('sandi_bank'));
|
||||
}
|
||||
|
||||
// Apply kolektibilitas filter
|
||||
if ($request->has('kolektibilitas') && !empty($request->get('kolektibilitas'))) {
|
||||
$query->where('kolektibilitas', $request->get('kolektibilitas'));
|
||||
}
|
||||
|
||||
// Apply jenis agunan filter
|
||||
if ($request->has('jenis_agunan') && !empty($request->get('jenis_agunan'))) {
|
||||
$query->where('jenis_agunan', $request->get('jenis_agunan'));
|
||||
}
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField', 'created_at');
|
||||
$query->orderBy($column, $order);
|
||||
} else {
|
||||
$query->orderBy('created_at', 'desc');
|
||||
}
|
||||
|
||||
// Get the total count of records
|
||||
$totalRecords = $query->count();
|
||||
|
||||
// Apply pagination if provided
|
||||
if ($request->has('page') && $request->has('size')) {
|
||||
$page = $request->get('page');
|
||||
$size = $request->get('size');
|
||||
$offset = ($page - 1) * $size; // Calculate the offset
|
||||
|
||||
$query->skip($offset)->take($size);
|
||||
}
|
||||
|
||||
// Get the filtered count of records
|
||||
$filteredRecords = $query->count();
|
||||
|
||||
// Get the data for the current page with relationships
|
||||
$data = $query->get();
|
||||
|
||||
// Transform data untuk datatables
|
||||
$transformedData = $data->map(function ($item) {
|
||||
return [
|
||||
'id' => $item->id,
|
||||
'sandi_bank' => $item->sandi_bank,
|
||||
'tahun' => $item->tahun,
|
||||
'bulan' => $item->bulan,
|
||||
'no_rekening' => $item->no_rekening,
|
||||
'cif' => $item->cif,
|
||||
'nama_debitur' => $item->nama_debitur,
|
||||
'kolektibilitas' => $item->kolektibilitas,
|
||||
'kolektibilitas_badge' => $item->kolektibilitas_badge,
|
||||
'fasilitas' => $item->fasilitas,
|
||||
'jenis_agunan' => $item->jenis_agunan,
|
||||
'nama_pemilik_agunan' => $item->nama_pemilik_agunan,
|
||||
'nilai_agunan' => $item->nilai_agunan_formatted,
|
||||
'nilai_agunan_ljk' => $item->nilai_agunan_ljk_formatted,
|
||||
'alamat_agunan' => $item->alamat_agunan,
|
||||
'lokasi_agunan' => $item->lokasi_agunan,
|
||||
'nama_cabang' => $item->nama_cabang,
|
||||
'kode_cabang' => $item->kode_cabang,
|
||||
'created_by' => $item->creator?->name ?? '-',
|
||||
'created_at' => dateFormat($item->created_at, true)
|
||||
];
|
||||
});
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / ($request->get('size', 10)));
|
||||
|
||||
// Calculate the current page number
|
||||
$currentPage = $request->get('page', 1);
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'recordsTotal' => $totalRecords,
|
||||
'recordsFiltered' => $filteredRecords,
|
||||
'pageCount' => $pageCount,
|
||||
'page' => $currentPage,
|
||||
'totalCount' => $totalRecords,
|
||||
'data' => $transformedData,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Import data slik dari Excel dengan optimasi memory dan progress tracking
|
||||
*
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
public function import(Request $request)
|
||||
{
|
||||
Log::info('SlikController: Starting import process with optimizations', [
|
||||
'user_id' => Auth::id(),
|
||||
'request_size' => $request->header('Content-Length'),
|
||||
'has_file' => $request->hasFile('file'),
|
||||
'memory_limit' => ini_get('memory_limit'),
|
||||
'max_execution_time' => ini_get('max_execution_time')
|
||||
]);
|
||||
|
||||
// Validasi file upload dengan logging detail dan error handling komprehensif
|
||||
try {
|
||||
// Cek apakah ada file yang diupload
|
||||
if (!$request->hasFile('file')) {
|
||||
Log::error('SlikController: Tidak ada file yang diupload', [
|
||||
'user_id' => Auth::id(),
|
||||
'files_count' => count($request->allFiles()),
|
||||
'request_data' => $request->all()
|
||||
]);
|
||||
throw ValidationException::withMessages(['file' => 'Tidak ada file yang diupload.']);
|
||||
}
|
||||
|
||||
$file = $request->file('file');
|
||||
|
||||
// Cek apakah file valid
|
||||
if (!$file->isValid()) {
|
||||
$error = $file->getError();
|
||||
$errorMessage = match($error) {
|
||||
UPLOAD_ERR_INI_SIZE => 'File terlalu besar (melebihi upload_max_filesize).',
|
||||
UPLOAD_ERR_FORM_SIZE => 'File terlalu besar (melebihi MAX_FILE_SIZE).',
|
||||
UPLOAD_ERR_PARTIAL => 'File hanya terupload sebagian.',
|
||||
UPLOAD_ERR_NO_FILE => 'Tidak ada file yang diupload.',
|
||||
UPLOAD_ERR_NO_TMP_DIR => 'Direktori temp tidak tersedia.',
|
||||
UPLOAD_ERR_CANT_WRITE => 'Gagal menulis file ke disk.',
|
||||
UPLOAD_ERR_EXTENSION => 'Upload dibatalkan oleh ekstensi PHP.',
|
||||
default => 'Error upload tidak diketahui: ' . $error
|
||||
};
|
||||
|
||||
Log::error('SlikController: File upload tidak valid', [
|
||||
'error' => $error,
|
||||
'error_message' => $errorMessage,
|
||||
'user_id' => Auth::id(),
|
||||
'file_info' => [
|
||||
'name' => $file->getClientOriginalName(),
|
||||
'size' => $file->getSize(),
|
||||
'mime' => $file->getMimeType()
|
||||
]
|
||||
]);
|
||||
throw ValidationException::withMessages(['file' => $errorMessage]);
|
||||
}
|
||||
|
||||
$maxFileSize = config('import.slik.max_file_size', 50) * 1024; // dalam KB
|
||||
$request->validate([
|
||||
'file' => 'required|file|mimes:xlsx,xls|max:' . $maxFileSize
|
||||
]);
|
||||
Log::info('SlikController: Validasi file berhasil');
|
||||
} catch (\Illuminate\Validation\ValidationException $e) {
|
||||
Log::error('SlikController: Validasi file gagal', [
|
||||
'errors' => $e->errors(),
|
||||
'user_id' => Auth::id(),
|
||||
'request_size' => $request->header('Content-Length')
|
||||
]);
|
||||
throw $e;
|
||||
}
|
||||
|
||||
try {
|
||||
$uploadedFile = $request->file('file');
|
||||
$originalName = $uploadedFile->getClientOriginalName();
|
||||
$fileSize = $uploadedFile->getSize();
|
||||
|
||||
Log::info('SlikController: Memulai import data Slik', [
|
||||
'user_id' => Auth::id(),
|
||||
'filename' => $originalName,
|
||||
'filesize' => $fileSize,
|
||||
'filesize_mb' => round($fileSize / 1024 / 1024, 2),
|
||||
'mime_type' => $uploadedFile->getMimeType(),
|
||||
'extension' => $uploadedFile->getClientOriginalExtension()
|
||||
]);
|
||||
|
||||
// Generate unique import ID
|
||||
$importId = uniqid('slik_import_');
|
||||
$userId = Auth::id() ?? 1;
|
||||
|
||||
// Cek apakah menggunakan queue processing untuk file besar
|
||||
$useQueue = config('import.slik.queue.enabled', false) && $fileSize > (5 * 1024 * 1024); // > 5MB
|
||||
|
||||
// Pastikan direktori temp ada
|
||||
$tempDir = storage_path('app/temp');
|
||||
if (!file_exists($tempDir)) {
|
||||
mkdir($tempDir, 0755, true);
|
||||
Log::info('SlikController: Direktori temp dibuat', ['path' => $tempDir]);
|
||||
}
|
||||
|
||||
// Simpan file sementara dengan nama unik
|
||||
$tempFileName = 'slik_import_' . time() . '_' . uniqid() . '.' . $uploadedFile->getClientOriginalExtension();
|
||||
$tempFilePath = $tempDir . '/' . $tempFileName;
|
||||
|
||||
Log::info('SlikController: Memindahkan file ke temp', [
|
||||
'temp_path' => $tempFilePath,
|
||||
'use_queue' => $useQueue
|
||||
]);
|
||||
|
||||
// Pindahkan file ke direktori temp
|
||||
$uploadedFile->move($tempDir, $tempFilePath);
|
||||
|
||||
// Verifikasi file berhasil dipindahkan
|
||||
if (!file_exists($tempFilePath)) {
|
||||
throw new Exception('File gagal dipindahkan ke direktori temp');
|
||||
}
|
||||
|
||||
Log::info('SlikController: File berhasil dipindahkan', [
|
||||
'file_size' => filesize($tempFilePath)
|
||||
]);
|
||||
|
||||
if ($useQueue) {
|
||||
Log::info('SlikController: Menggunakan queue processing untuk file besar', [
|
||||
'import_id' => $importId,
|
||||
'file_size_mb' => round($fileSize / 1024 / 1024, 2)
|
||||
]);
|
||||
|
||||
// Dispatch job ke queue
|
||||
\Modules\Lpj\Jobs\ProcessSlikImport::dispatch($tempFilePath, $userId, $importId);
|
||||
|
||||
return redirect()->back()->with('success', 'Import sedang diproses di background. ID: ' . $importId);
|
||||
}
|
||||
|
||||
// Import langsung untuk file kecil
|
||||
Log::info('SlikController: Processing file directly', [
|
||||
'import_id' => $importId,
|
||||
'file_size_mb' => round($fileSize / 1024 / 1024, 2)
|
||||
]);
|
||||
|
||||
// Set optimasi memory untuk import langsung
|
||||
$memoryLimit = config('import.slik.memory_limit', 256);
|
||||
ini_set('memory_limit', $memoryLimit . 'M');
|
||||
ini_set('max_execution_time', config('import.slik.timeout', 30000));
|
||||
|
||||
// Enable garbage collection jika diizinkan
|
||||
if (config('import.slik.enable_gc', true)) {
|
||||
gc_enable();
|
||||
}
|
||||
|
||||
// Proses import menggunakan SlikImport class
|
||||
Log::info('SlikController: Memulai proses Excel import');
|
||||
$import = new SlikImport();
|
||||
Excel::import($import, $tempFilePath);
|
||||
Log::info('SlikController: Excel import selesai');
|
||||
|
||||
// Force garbage collection setelah selesai
|
||||
if (config('import.slik.enable_gc', true)) {
|
||||
gc_collect_cycles();
|
||||
}
|
||||
|
||||
// Hapus file temporary setelah import
|
||||
if (file_exists($tempFilePath)) {
|
||||
unlink($tempFilePath);
|
||||
Log::info('SlikController: File temp berhasil dihapus');
|
||||
}
|
||||
|
||||
Log::info('SlikController: Data Slik berhasil diimport', [
|
||||
'user_id' => Auth::id(),
|
||||
'import_id' => $importId
|
||||
]);
|
||||
|
||||
return redirect()->back()->with('success', 'Data Slik berhasil diimport dari file Excel.');
|
||||
|
||||
} catch (Exception $e) {
|
||||
// Hapus file temporary jika ada error
|
||||
if (isset($tempFilePath) && file_exists($tempFilePath)) {
|
||||
unlink($tempFilePath);
|
||||
Log::info('SlikController: File temp dihapus karena error');
|
||||
}
|
||||
|
||||
Log::error('SlikController: Gagal import data Slik', [
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString(),
|
||||
'user_id' => Auth::id(),
|
||||
'file' => $e->getFile(),
|
||||
'line' => $e->getLine(),
|
||||
'memory_usage' => memory_get_usage(true)
|
||||
]);
|
||||
|
||||
return redirect()->back()->with('error', 'Gagal import data Slik: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Menampilkan halaman form import
|
||||
*
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function importForm()
|
||||
{
|
||||
return view('lpj::slik.import');
|
||||
}
|
||||
|
||||
/**
|
||||
* Download template Excel untuk import
|
||||
*
|
||||
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
|
||||
*/
|
||||
public function downloadTemplate()
|
||||
{
|
||||
$templatePath = resource_path('metronic/slik.xlsx');
|
||||
|
||||
if (!file_exists($templatePath)) {
|
||||
return redirect()->back()->with('error', 'Template file tidak ditemukan.');
|
||||
}
|
||||
|
||||
return response()->download($templatePath, 'template_slik.xlsx');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get import progress
|
||||
*
|
||||
* @param string $importId
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function progress(string $importId)
|
||||
{
|
||||
try {
|
||||
$progressService = new \Modules\Lpj\Services\ImportProgressService();
|
||||
$progress = $progressService->getProgress($importId);
|
||||
|
||||
if (!$progress) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Progress import tidak ditemukan'
|
||||
], 404);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'progress' => $progress
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error('SlikController: Error getting progress', [
|
||||
'import_id' => $importId,
|
||||
'error' => $e->getMessage()
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Gagal mendapatkan progress: ' . $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Export data SLIK ke Excel
|
||||
*
|
||||
* Method ini menangani export data SLIK ke format Excel dengan:
|
||||
* - Logging aktivitas export
|
||||
* - Error handling yang proper
|
||||
* - Format Excel yang sesuai dengan struktur SLIK
|
||||
*
|
||||
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
|
||||
*/
|
||||
public function export()
|
||||
{
|
||||
try {
|
||||
Log::info('SLIK Export: Memulai proses export data SLIK', [
|
||||
'user_id' => Auth::id(),
|
||||
'timestamp' => now(),
|
||||
'memory_usage' => memory_get_usage(true) / 1024 / 1024 . ' MB'
|
||||
]);
|
||||
|
||||
// Hitung total data yang akan di-export
|
||||
$totalData = Slik::count();
|
||||
|
||||
Log::info('SLIK Export: Informasi data export', [
|
||||
'total_records' => $totalData,
|
||||
'user_id' => Auth::id(),
|
||||
'timestamp' => now()
|
||||
]);
|
||||
|
||||
// Generate nama file dengan timestamp
|
||||
$filename = 'slik_export_' . date('Y-m-d_H-i-s') . '.xlsx';
|
||||
|
||||
// Proses export menggunakan SlikExport class
|
||||
$export = Excel::download(new SlikExport(), $filename);
|
||||
|
||||
Log::info('SLIK Export: Berhasil generate file export', [
|
||||
'filename' => $filename,
|
||||
'total_records' => $totalData,
|
||||
'user_id' => Auth::id(),
|
||||
'timestamp' => now(),
|
||||
'memory_peak' => memory_get_peak_usage(true) / 1024 / 1024 . ' MB'
|
||||
]);
|
||||
|
||||
return $export;
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error('SLIK Export: Gagal melakukan export data SLIK', [
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString(),
|
||||
'user_id' => Auth::id(),
|
||||
'timestamp' => now(),
|
||||
'memory_usage' => memory_get_usage(true) / 1024 / 1024 . ' MB'
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Gagal melakukan export data SLIK: ' . $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Truncate all SLIK data
|
||||
*
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function truncate()
|
||||
{
|
||||
try {
|
||||
DB::beginTransaction();
|
||||
|
||||
Log::info('SLIK Truncate: Memulai proses truncate data SLIK', [
|
||||
'user_id' => Auth::id(),
|
||||
'timestamp' => now()
|
||||
]);
|
||||
|
||||
// Truncate tabel SLIK
|
||||
Slik::truncate();
|
||||
|
||||
DB::commit();
|
||||
|
||||
Log::info('SLIK Truncate: Berhasil menghapus semua data SLIK', [
|
||||
'user_id' => Auth::id(),
|
||||
'timestamp' => now()
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Semua data SLIK berhasil dihapus'
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
DB::rollback();
|
||||
|
||||
Log::error('SLIK Truncate: Gagal menghapus data SLIK', [
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString(),
|
||||
'user_id' => Auth::id(),
|
||||
'timestamp' => now()
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Gagal menghapus data SLIK: ' . $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -34,17 +34,20 @@ use Illuminate\Support\Facades\Auth;
|
||||
}
|
||||
|
||||
// Retrieve data from the database
|
||||
$query =Permohonan::query()->with(['penawaran','penawaran.tujuanPenilaianKjpp'])
|
||||
->where('permohonan.status','=','spk');
|
||||
// $query =Permohonan::query()->with(['penawaran','penawaran.tujuanPenilaianKjpp'])->where('permohonan.status','=','spk');
|
||||
// $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian','penilaian'])->get();
|
||||
//$query =Permohonan::query()->with(['user', 'debiture', 'branch', 'tujuanPenilaian','penilaian','penawaran','penawaran.tujuanPenilaianKjpp'])->where('permohonan.status','=','spk');
|
||||
|
||||
$query = PenawaranTender::query()->with(['permohonan.user', 'permohonan.debiture', 'permohonan.branch', 'permohonan.tujuanPenilaian','permohonan.penilaian','tujuanPenilaianKjpp']);
|
||||
|
||||
|
||||
// Apply search filter if provided
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
$search = $request->get('search');
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
$q->orWhere('penawaran.tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
|
||||
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
$q->whereRelation('permohonan','nomor_registrasi', 'LIKE', '%' . $search . '%');
|
||||
//$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
||||
//$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
||||
});
|
||||
}
|
||||
|
||||
@@ -78,6 +81,11 @@ use Illuminate\Support\Facades\Auth;
|
||||
$i=0;
|
||||
foreach($data as $obj)
|
||||
{
|
||||
// tanggal_permohonan
|
||||
if ($obj->permohonan->tanggal_permohonan) {
|
||||
$data[$i]->permohonan->tanggal_permohonan = Carbon::parse($obj->permohonan->tanggal_permohonan)->format('d M Y');
|
||||
}
|
||||
|
||||
if($obj->tanggal_penilaian_sebelumnya)
|
||||
{
|
||||
$data[$i]->tanggal_penilaian_sebelumnya = Carbon::parse($obj->tanggal_penilaian_sebelumnya)->format('d F Y H:i:s');
|
||||
@@ -92,22 +100,21 @@ use Illuminate\Support\Facades\Auth;
|
||||
// date_range
|
||||
if($obj->start_date && $obj->end_date)
|
||||
{
|
||||
$data[$i]->date_range = Carbon::parse($obj->start_date)->format('d M Y').' - '.Carbon::parse($obj->end_date)->format('d M Y');
|
||||
$data[$i]->date_range = Carbon::parse($obj->start_date)->format('d M Y').' - '.
|
||||
Carbon::parse($obj->end_date)->format('d M Y');
|
||||
|
||||
}
|
||||
|
||||
// data dokumen_spk
|
||||
if($obj->dokumen)
|
||||
// data spk_dokumen_path
|
||||
if($obj->spk_dokumen_path)
|
||||
{
|
||||
$spkpenawaran_path = Storage::url($obj->dokumen);
|
||||
// dd($spkpenawaran_path);
|
||||
$data[$i]->dokumen = $spkpenawaran_path;
|
||||
$spk_dokumen_path = Storage::url($obj->spk_dokumen_path);
|
||||
$data[$i]->spk_dokumen_path = $spk_dokumen_path;
|
||||
}
|
||||
|
||||
$i++;
|
||||
}
|
||||
|
||||
|
||||
// Calculate the page count
|
||||
$pageCount = ceil($totalRecords / $request->get('size'));
|
||||
|
||||
@@ -141,17 +148,17 @@ use Illuminate\Support\Facades\Auth;
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
$penawaran = PenawaranTender::leftJoin('detail_penawaran', 'detail_penawaran.penawaran_id','=','penawaran.id')
|
||||
->leftJoin('jenis_laporan', 'jenis_laporan.id','=','penawaran.jenis_laporan_id')
|
||||
->leftJoin('kjpp', 'kjpp.id','=','detail_penawaran.kjpp_rekanan_id')
|
||||
->where('detail_penawaran.status','=',1)
|
||||
->where('penawaran.id','=', $id)
|
||||
->select('penawaran.*', 'detail_penawaran.attachment as attachmentku',
|
||||
'detail_penawaran.biaya_penawaran as detail_penawaran_biaya_penawaran',
|
||||
'kjpp.name as kjpp_name',
|
||||
'kjpp.address as kjpp_address',
|
||||
'jenis_laporan.name as jenis_laporan_name'
|
||||
)->first();
|
||||
$penawaran = PenawaranTender::with(['jenisLaporan','tujuanPenilaianKjpp','detail.kjpp','penilaian','persetujuan_penawaran'])->where('id',$id)->first();
|
||||
$penawaran->attachmentku = $penawaran->detail->attachment;
|
||||
$penawaran->detail_penawaran_no_proposal = $penawaran->detail->no_proposal;
|
||||
$penawaran->detail_penawaran_tgl_proposal = $penawaran->detail->tgl_proposal;
|
||||
$penawaran->detail_penawaran_biaya_penawaran = $penawaran->detail->biaya_penawaran;
|
||||
$penawaran->kjpp_name = $penawaran->detail->kjpp->name;
|
||||
$penawaran->kjpp_address = $penawaran->detail->kjpp->address;
|
||||
$penawaran->jenis_laporan_name = $penawaran->jenisLaporan->name;
|
||||
$penawaran->jenis_laporan_code = $penawaran->jenisLaporan->code;
|
||||
$penawaran->tujuan_penilaian_kjpp_name = $penawaran->tujuanPenilaianKjpp->name;
|
||||
$penawaran->penilaian_waktu_penilain = $penawaran->penilaian->waktu_penilaian ?? "";
|
||||
|
||||
$permohonan = Permohonan::where('nomor_registrasi','=',$penawaran->nomor_registrasi)
|
||||
->leftJoin('dokumen_jaminan', 'dokumen_jaminan.permohonan_id','=','permohonan.id')
|
||||
@@ -159,35 +166,100 @@ use Illuminate\Support\Facades\Auth;
|
||||
->select('permohonan.*', 'jenis_jaminan.name as jenis_jaminan_name',
|
||||
'dokumen_jaminan.address as dokumen_jaminan_address');
|
||||
|
||||
$data = $permohonan->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->first();
|
||||
$data = $permohonan->with(['user', 'debiture', 'branch', 'tujuanPenilaian','dokumenjaminan.detail'])->first();
|
||||
|
||||
return view('lpj::spk.edit', compact('data', 'penawaran'));
|
||||
if($penawaran->detail_penawaran_tgl_proposal)
|
||||
$penawaran->detail_penawaran_tgl_proposal = Carbon::parse($penawaran->detail_penawaran_tgl_proposal)->format('d F Y');
|
||||
|
||||
// generate no spk
|
||||
$spk_no_last=$penawaran->spk_no;
|
||||
if(!$spk_no_last)
|
||||
{
|
||||
$spk_no_last = onLastnumberCodePenawaranSPK($penawaran->jenis_laporan_code);
|
||||
$penawaran->spk_no = $spk_no_last;
|
||||
}
|
||||
|
||||
// pengecekan perubahan jenis report
|
||||
$array_no_last = explode("/",$spk_no_last);
|
||||
$jenis_report_old=trim($array_no_last[4]);
|
||||
if($jenis_report_old!=$penawaran->jenis_laporan_code)
|
||||
{
|
||||
$penawaran->spk_no=str_replace($jenis_report_old,$penawaran->jenis_laporan_code,$spk_no_last);
|
||||
}
|
||||
// pengecekan perubahan jenis report
|
||||
// generate no spk
|
||||
|
||||
// Jangka Waktu
|
||||
// date_start (penilaian.waktu_penilain + 1 day) - date_end (persetujuan_penawaran.sla_final)
|
||||
$jangka_waktu='';
|
||||
// Jangka Waktu
|
||||
$persetujuan_no_proposal = $penawaran->detail_penawaran_no_proposal;
|
||||
$persetujuan_tgl_proposal = $penawaran->detail_penawaran_tgl_proposal;
|
||||
$persetujuan_sla_resume = '...';
|
||||
$persetujuan_sla_final = '...';
|
||||
if(null !==$penawaran->persetujuan)
|
||||
{
|
||||
$sla_resume_text = ceil($data->sla/2);
|
||||
$sla_final_text = $data->sla;
|
||||
|
||||
$sla_resume_text_terbilang = ucfirst(terbilang($sla_resume_text));
|
||||
$sla_final_text_terbilang = ucfirst(terbilang($sla_final_text));
|
||||
|
||||
$persetujuan_no_proposal = $penawaran->persetujuan->nomor_proposal_penawaran;
|
||||
$persetujuan_tgl_proposal = Carbon::parse($penawaran->persetujuan->tanggal_proposal_penawaran)->format('d F Y');
|
||||
$persetujuan_sla_resume = $sla_resume_text.' ('.$sla_resume_text_terbilang.')';
|
||||
$persetujuan_sla_final = $sla_final_text.' ('.$sla_final_text_terbilang.')';
|
||||
|
||||
if($penawaran->penilaian_waktu_penilain)
|
||||
{
|
||||
$jangka_waktu_date_start=Carbon::parse($penawaran->penilaian_waktu_penilain)->addDays(1)->format('d F Y');
|
||||
$jangka_waktu_date_end=Carbon::parse($penawaran->persetujuan->sla_final)->format('d F Y');
|
||||
// Jangka Waktu
|
||||
// date_start (penilaian.waktu_penilain + 1 day) - date_end (persetujuan_penawaran.sla_final)
|
||||
$jangka_waktu=$jangka_waktu_date_start.' - '.$jangka_waktu_date_end;
|
||||
// Jangka Waktu
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return view('lpj::spk.edit', compact('data', 'penawaran', 'persetujuan_no_proposal', 'persetujuan_tgl_proposal', 'persetujuan_sla_resume', 'persetujuan_sla_final', 'jangka_waktu'));
|
||||
}
|
||||
|
||||
public function update(Request $request, $id): JsonResponse
|
||||
{
|
||||
|
||||
// init
|
||||
$data1 = array();
|
||||
$dataPermohonan = array();
|
||||
$data1 = [];
|
||||
// $dataPermohonan = array();
|
||||
$dataPenawaran = [];
|
||||
// data
|
||||
|
||||
$penawaran = PenawaranTender::leftJoin('detail_penawaran', 'detail_penawaran.penawaran_id','=','penawaran.id')
|
||||
->leftJoin('jenis_laporan', 'jenis_laporan.id','=','penawaran.jenis_laporan_id')
|
||||
->leftJoin('kjpp', 'kjpp.id','=','detail_penawaran.kjpp_rekanan_id')
|
||||
->where('detail_penawaran.status','=',1)
|
||||
->where('penawaran.id','=', $id)
|
||||
->select('penawaran.*', 'detail_penawaran.attachment as attachmentku',
|
||||
'kjpp.name as kjpp_name',
|
||||
'kjpp.address as kjpp_address',
|
||||
'jenis_laporan.name as jenis_laporan_name'
|
||||
)->first();
|
||||
$penawaran = PenawaranTender::with(['jenisLaporan','tujuanPenilaianKjpp','detail.kjpp','penilaian','persetujuan_penawaran'])->where('id',$id)->first();
|
||||
$penawaran->attachmentku = $penawaran->detail->attachment;
|
||||
$penawaran->detail_penawaran_no_proposal = $penawaran->detail->no_proposal;
|
||||
$penawaran->detail_penawaran_tgl_proposal = $penawaran->detail->tgl_proposal;
|
||||
$penawaran->detail_penawaran_biaya_penawaran = $penawaran->detail->biaya_penawaran;
|
||||
$penawaran->kjpp_name = $penawaran->detail->kjpp->name;
|
||||
$penawaran->kjpp_address = $penawaran->detail->kjpp->address;
|
||||
$penawaran->jenis_laporan_name = $penawaran->jenisLaporan->name;
|
||||
$penawaran->jenis_laporan_code = $penawaran->jenisLaporan->code;
|
||||
$penawaran->tujuan_penilaian_kjpp_name = $penawaran->tujuanPenilaianKjpp->name;
|
||||
$penawaran->penilaian_waktu_penilain = $penawaran->penilaian->waktu_penilaian ?? "";
|
||||
|
||||
$permohonan = Permohonan::where('nomor_registrasi','=',$penawaran->nomor_registrasi)
|
||||
->leftJoin('dokumen_jaminan', 'dokumen_jaminan.permohonan_id','=','permohonan.id')
|
||||
->leftJoin('jenis_jaminan', 'jenis_jaminan.id','=','dokumen_jaminan.jenis_jaminan_id')
|
||||
->select('permohonan.*', 'jenis_jaminan.name as jenis_jaminan_name');
|
||||
|
||||
$data = $permohonan->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->first();
|
||||
$data = $permohonan->with(['user', 'debiture', 'branch', 'tujuanPenilaian','dokumenjaminan'])->first();
|
||||
|
||||
// Jangka Waktu
|
||||
// date_start (penilaian.waktu_penilain + 1 day) - date_end (persetujuan_penawaran.sla_final)
|
||||
$jangka_waktu='';
|
||||
// Jangka Waktu
|
||||
|
||||
if($penawaran->detail_penawaran_tgl_proposal)
|
||||
$penawaran->detail_penawaran_tgl_proposal = Carbon::parse($penawaran->detail_penawaran_tgl_proposal)->format('d F Y');
|
||||
|
||||
$folderPath = 'uploads/spk/';
|
||||
$extension = '.pdf';
|
||||
@@ -195,18 +267,97 @@ use Illuminate\Support\Facades\Auth;
|
||||
$newFileNameWithPath = $folderPath . $newFileName;
|
||||
|
||||
// update table permohonan
|
||||
$dataPermohonan=['dokumen' => $newFileNameWithPath];
|
||||
$data->update($dataPermohonan);
|
||||
// $dataPermohonan=['dokumen' => $newFileNameWithPath];
|
||||
// $data->update($dataPermohonan);
|
||||
// update table permohonan
|
||||
|
||||
// update table penawaran
|
||||
$dataPenawaran['spk_dokumen_path'] = $newFileNameWithPath;
|
||||
// $spk_no_last=$penawaran->spk_no;
|
||||
if(!$penawaran->spk_no)
|
||||
{
|
||||
$spk_no_last = onLastnumberCodePenawaranSPK($penawaran->jenis_laporan_code);
|
||||
// $penawaran->no_spk = $no_spk_last;
|
||||
$date_now = Carbon::now()->format('Ymd');// 20240124
|
||||
$spk_number = substr ($spk_no_last, 0, 3);
|
||||
$dataPenawaran['spk_no'] = $spk_no_last;
|
||||
$dataPenawaran['spk_no_core'] = $date_now.'_'.$spk_number;
|
||||
|
||||
$penawaran->spk_no = $spk_no_last;
|
||||
|
||||
}
|
||||
|
||||
// pengecekan perubahan jenis report
|
||||
$spk_no_old=$penawaran->spk_no;
|
||||
$array_no_last = explode("/",$spk_no_old);
|
||||
$jenis_report_old=trim($array_no_last[4]);
|
||||
if($jenis_report_old!=$penawaran->jenis_laporan_code)
|
||||
{
|
||||
$penawaran_spk_no_new=str_replace($jenis_report_old,$penawaran->jenis_laporan_code,$spk_no_old);
|
||||
$penawaran->spk_no=$penawaran_spk_no_new;
|
||||
$dataPenawaran['spk_no'] = $penawaran_spk_no_new;
|
||||
}
|
||||
// pengecekan perubahan jenis report
|
||||
|
||||
$penawaranM = PenawaranTender::find($penawaran->id);
|
||||
$penawaranM->update($dataPenawaran);
|
||||
// update table penawaran
|
||||
|
||||
// pdf path
|
||||
$spkpenawaran_path = Storage::url($newFileNameWithPath);
|
||||
|
||||
$pdf =Pdf::loadView('lpj::spk.documentSPK', compact('data', 'penawaran'));
|
||||
$persetujuan_no_proposal = $penawaran->detail_penawaran_no_proposal;
|
||||
$persetujuan_tgl_proposal = $penawaran->detail_penawaran_tgl_proposal;
|
||||
$persetujuan_sla_resume = '...';
|
||||
$persetujuan_sla_final = '...';
|
||||
if(null !==$penawaran->persetujuan)
|
||||
{
|
||||
//$sla_resume_text = $penawaran->persetujuan->sla_resume;
|
||||
//$sla_final_text = $penawaran->persetujuan->sla_final;
|
||||
|
||||
$sla_resume_text = ceil($data->sla/2);
|
||||
$sla_final_text = $data->sla;
|
||||
|
||||
$sla_resume_text_terbilang = ucfirst(terbilang($sla_resume_text));
|
||||
$sla_final_text_terbilang = ucfirst(terbilang($sla_final_text));
|
||||
|
||||
$persetujuan_no_proposal = $penawaran->persetujuan->nomor_proposal_penawaran;
|
||||
$persetujuan_tgl_proposal = Carbon::parse($penawaran->persetujuan->tanggal_proposal_penawaran)->format('d F Y');
|
||||
$persetujuan_sla_resume = $sla_resume_text.' ('.$sla_resume_text_terbilang.')';
|
||||
$persetujuan_sla_final = $sla_final_text.' ('.$sla_final_text_terbilang.')';
|
||||
|
||||
if($penawaran->penilaian_waktu_penilain)
|
||||
{
|
||||
$jangka_waktu_date_start=Carbon::parse($penawaran->penilaian_waktu_penilain)->addDays(1)->format('d F Y');
|
||||
$jangka_waktu_date_end=Carbon::parse($penawaran->persetujuan->sla_final)->format('d F Y');
|
||||
// Jangka Waktu
|
||||
// date_start (penilaian.waktu_penilain + 1 day) - date_end (persetujuan_penawaran.sla_final)
|
||||
$jangka_waktu=$jangka_waktu_date_start.' - '.$jangka_waktu_date_end;
|
||||
// Jangka Waktu
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
$pdf =Pdf::loadView('lpj::spk.documentSPK', compact('data', 'penawaran', 'persetujuan_no_proposal', 'persetujuan_tgl_proposal', 'persetujuan_sla_resume', 'persetujuan_sla_final', 'jangka_waktu'));
|
||||
$pdf->setPaper('A4', 'portrait');
|
||||
$content = $pdf->download()->getOriginalContent();
|
||||
Storage::put('public/'.$newFileNameWithPath,$content);
|
||||
|
||||
$permohonanModel = Permohonan::where('nomor_registrasi', $penawaran->nomor_registrasi)->first();
|
||||
if ($permohonanModel) {
|
||||
$permohonanModel->status = 'registrasi-final';
|
||||
$permohonanModel->save();
|
||||
}
|
||||
|
||||
$persetujuanPenawaran = PenawaranTender::where('id', $penawaran->id)->first();
|
||||
if ($persetujuanPenawaran) {
|
||||
$persetujuanPenawaran->status = 'registrasi-final';
|
||||
$persetujuanPenawaran->save();
|
||||
}
|
||||
|
||||
|
||||
$data1['status'] = 'success';
|
||||
$data1['spkpenawaran_path'] = $spkpenawaran_path;
|
||||
$data1['message']['message_success'] = array('Generate SPK PDF successfully');
|
||||
@@ -242,8 +393,26 @@ use Illuminate\Support\Facades\Auth;
|
||||
}
|
||||
|
||||
public function download($id) {
|
||||
$document = Permohonan::find($id);
|
||||
// dokumen pdf diambil dari penawaran.spk_dokumen_path
|
||||
$document = PenawaranTender::find($id);
|
||||
|
||||
return response()->download(storage_path('app/public/' .$document->dokumen));
|
||||
return response()->download(storage_path('app/public/' .$document->spk_dokumen_path));
|
||||
}
|
||||
|
||||
public function updateSla(Request $request, $id): JsonResponse
|
||||
{
|
||||
|
||||
$request->validate([
|
||||
'sla' => 'required|integer|min:1',
|
||||
]);
|
||||
|
||||
|
||||
$penawaran = PenawaranTender::find($id);
|
||||
$permohonan = Permohonan::where('nomor_registrasi','=',$penawaran->nomor_registrasi)->first();
|
||||
|
||||
$permohonan->sla = $request->sla;
|
||||
$permohonan->save();
|
||||
|
||||
return response()->json(['message' => 'SLA updated successfully']);
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -196,6 +196,9 @@ class TeamsController extends Controller
|
||||
->leftJoin('teams_users', 'teams.id', '=', 'teams_users.teams_id')
|
||||
->leftJoin('users', 'teams_users.user_id', '=', 'users.id')
|
||||
->addSelect('users.id as user_id', 'users.name as user_name');
|
||||
|
||||
|
||||
|
||||
|
||||
// Filter pencarian
|
||||
if ($request->has('search') && !empty($request->get('search'))) {
|
||||
|
||||
@@ -5,17 +5,25 @@ namespace Modules\Lpj\Http\Controllers;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Lpj\Models\KJPP;
|
||||
use Modules\Location\Models\City;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Location\Models\Village;
|
||||
use Modules\Lpj\Models\JenisLaporan;
|
||||
use Modules\Location\Models\District;
|
||||
use Modules\Location\Models\Province;
|
||||
use Modules\Lpj\Models\PenawaranTender;
|
||||
use Modules\Lpj\Models\StatusPermohonan;
|
||||
use Modules\Lpj\Models\TujuanPenilaianKJPP;
|
||||
use Modules\Lpj\Models\PenawaranDetailTender;
|
||||
use Modules\Lpj\Exports\PenawaranTenderExport;
|
||||
use Modules\Lpj\Http\Requests\TenderPenawaranRequest;
|
||||
use Modules\Lpj\Jobs\SendPenawaranKJPPTenderJob;
|
||||
use Modules\Lpj\Jobs\SendPenawaranTenderJob;
|
||||
use Modules\Lpj\Models\PenawaranEmailTenderLog;
|
||||
|
||||
class TenderController extends Controller
|
||||
{
|
||||
@@ -66,12 +74,14 @@ class TenderController extends Controller
|
||||
$permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first();
|
||||
|
||||
// Add created_by/updated_by from the authenticated user
|
||||
$userId = auth()->user()->id;
|
||||
$userId = Auth::user()->id;
|
||||
|
||||
$validated['nomor_registrasi'] = $permohonan->nomor_registrasi;
|
||||
|
||||
$validated['status'] = $request->input('status') ?? 'tender';
|
||||
$validated['updated_by'] = $userId; // Updating the record
|
||||
$validated['end_date'] = $request->input('end_date') . ' 17:00:00';
|
||||
// dd($validated['end_date']);
|
||||
$permohonan->update($validated);
|
||||
|
||||
// Adding created_by for the new PenawaranTender record
|
||||
@@ -117,6 +127,15 @@ class TenderController extends Controller
|
||||
$penawaranExists = PenawaranTender::where('nomor_registrasi', $noreg)->exists();
|
||||
|
||||
$penawaran1 = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
|
||||
|
||||
if (!$penawaran1) {
|
||||
return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])->with('error', 'Penawaran dengan nomor registrasi ini belum dibuat. Silahkan isi terlebih dahulu!');
|
||||
}
|
||||
|
||||
if ($penawaran1->status != 'tender') {
|
||||
return redirect()->route('otorisasitender.penawaran.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk Otorisasi Tender tidak bisa masuk penawaran lagi!');
|
||||
}
|
||||
|
||||
// dd($penawaran1->id);
|
||||
if ($penawaran1) {
|
||||
$penawaran = $penawaran1;
|
||||
@@ -141,8 +160,18 @@ class TenderController extends Controller
|
||||
{
|
||||
// Find the specific penawaran by its ID
|
||||
$penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
|
||||
|
||||
if (!$penawaran) {
|
||||
return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])->with('error', 'Penawaran dengan nomor registrasi ini belum dibuat. Silahkan isi terlebih dahulu!');
|
||||
}
|
||||
|
||||
$permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first();
|
||||
|
||||
|
||||
if ($penawaran->status != 'tender') {
|
||||
return redirect()->route('otorisasitender.penawaran.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk Otorisasi Tender tidak bisa masuk penawaran lagi!');
|
||||
}
|
||||
|
||||
$status = StatusPermohonan::all();
|
||||
$tujuan_penilaian_kjpp = TujuanPenilaianKJPP::all();
|
||||
$jenis_laporan = JenisLaporan::all();
|
||||
@@ -152,6 +181,8 @@ class TenderController extends Controller
|
||||
|
||||
$kjpp = KJPP::all();
|
||||
|
||||
// dd($penawaran);
|
||||
|
||||
return view('lpj::penawaran.edit', compact('status', 'tujuan_penilaian_kjpp', 'jenis_laporan', 'kjpp', 'penawaran', 'noreg', 'kjpps', 'permohonan'));
|
||||
}
|
||||
|
||||
@@ -171,13 +202,15 @@ class TenderController extends Controller
|
||||
$permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first();
|
||||
|
||||
// Ambil ID user yang sedang login
|
||||
$userId = auth()->user()->id;
|
||||
$userId = Auth::user()->id;
|
||||
|
||||
// Jangan ubah created_by untuk data yang sudah ada
|
||||
$validated['nomor_registrasi'] = $penawaran->nomor_registrasi;
|
||||
$validated['status'] = $request->input('status') ?? 'tender';
|
||||
$validated['created_by'] = $userId;
|
||||
$validated['updated_by'] = $userId; // Hanya update 'updated_by'
|
||||
$validated['end_date'] = $request->input('end_date') . ' 17:00:00';
|
||||
// dd($validated['end_date']);
|
||||
|
||||
// Update data penawaran dan permohonan
|
||||
$penawaran->update($validated);
|
||||
@@ -228,7 +261,7 @@ class TenderController extends Controller
|
||||
DB::commit();
|
||||
|
||||
return redirect()
|
||||
->route('tender.penawaran.index')
|
||||
->route('tender.penawaran.ulang.index')
|
||||
->with('success', 'Data Penawaran updated successfully');
|
||||
} catch (Exception $e) {
|
||||
// Rollback jika ada kesalahan
|
||||
@@ -247,19 +280,97 @@ class TenderController extends Controller
|
||||
public function showSuratTender($noreg)
|
||||
{
|
||||
$penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
|
||||
$permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first();
|
||||
|
||||
// Kalau tidak ketemu nomor registrasi dengan tabel penawaran
|
||||
if (!$penawaran) {
|
||||
return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])
|
||||
->with('error', 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!');
|
||||
}
|
||||
|
||||
if ($penawaran->status != 'tender') {
|
||||
return redirect()->route('otorisasitender.penawaran.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk Otorisasi Tender tidak bisa masuk penawaran lagi!');
|
||||
}
|
||||
|
||||
// Kalau tidak ada dokumen jaminan maka di arahkan ke halaman dokumen jaminan
|
||||
if ($permohonan->documents->isEmpty()) {
|
||||
return redirect()->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id])
|
||||
->with('error', 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!');
|
||||
}
|
||||
|
||||
foreach ($permohonan->documents as $document) {
|
||||
$village_permohonan = $document->village_code;
|
||||
$district_permohonan = $document->district_code;
|
||||
$city_permohonan = $document->city_code;
|
||||
$province_permohonan = $document->province_code;
|
||||
}
|
||||
|
||||
$villages = Village::where('code', $village_permohonan)->get();
|
||||
$districts = District::where('code', $district_permohonan)->get();
|
||||
$cities = City::where('code', $city_permohonan)->get();
|
||||
$provinces = Province::where('code', $province_permohonan)->get();
|
||||
|
||||
date_default_timezone_set('Asia/Jakarta');
|
||||
|
||||
$now = date('Y-m-d H:i:s');
|
||||
// Jika batas tanggal penawaran sudah lewat
|
||||
if ($penawaran->end_date < date('Y-m-d')) {
|
||||
if ($penawaran->end_date < $now) {
|
||||
return redirect()->route('tender.penawaran.editPenawaran', ['noreg' => $noreg])
|
||||
->with('error', 'Sudah Kadaluarsa. Silahkan perpanjang tanggal penawaran terlebih dahulu!');
|
||||
}
|
||||
|
||||
return view('lpj::penawaran.surat_tender', compact('penawaran', 'noreg'));
|
||||
return view('lpj::penawaran.surat_tender', compact('penawaran', 'noreg', 'permohonan', 'villages', 'districts', 'cities', 'provinces'));
|
||||
}
|
||||
|
||||
public function suratTenderKJPP($noreg, $id)
|
||||
{
|
||||
$kjpp = KJPP::find($id);
|
||||
$permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first();
|
||||
$penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
|
||||
|
||||
if (!$penawaran) {
|
||||
return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $penawaran->nomor_registrasi])
|
||||
->with('error', 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!');
|
||||
}
|
||||
|
||||
if ($penawaran->status != 'tender') {
|
||||
return redirect()->route('otorisasitender.penawaran.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk Otorisasi Tender tidak bisa masuk penawaran lagi!');
|
||||
}
|
||||
|
||||
// Kalau tidak ada dokumen jaminan maka di arahkan ke halaman dokumen jaminan
|
||||
if ($permohonan->documents->isEmpty()) {
|
||||
return redirect()->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id])
|
||||
->with('error', 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!');
|
||||
}
|
||||
|
||||
foreach ($permohonan->documents as $document) {
|
||||
$village_permohonan = $document->village_code;
|
||||
$district_permohonan = $document->district_code;
|
||||
$city_permohonan = $document->city_code;
|
||||
$province_permohonan = $document->province_code;
|
||||
}
|
||||
|
||||
$villages = Village::where('code', $village_permohonan)->get();
|
||||
$districts = District::where('code', $district_permohonan)->get();
|
||||
$cities = City::where('code', $city_permohonan)->get();
|
||||
$provinces = Province::where('code', $province_permohonan)->get();
|
||||
|
||||
date_default_timezone_set('Asia/Jakarta');
|
||||
|
||||
$now = date('Y-m-d H:i:s');
|
||||
// Jika batas tanggal penawaran sudah lewat
|
||||
if ($penawaran->end_date < $now) {
|
||||
return redirect()->route('tender.penawaran.editPenawaran', ['noreg' => $noreg])
|
||||
->with('error', 'Sudah Kadaluarsa. Silahkan perpanjang tanggal penawaran terlebih dahulu!');
|
||||
}
|
||||
|
||||
$detail_penawaran = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $kjpp->id)->get();
|
||||
|
||||
foreach ($detail_penawaran as $detail) {
|
||||
$detail_penawaran_1 = $detail->kjpp;
|
||||
}
|
||||
|
||||
return view('lpj::penawaran.surat_tender_kjpp', compact('penawaran', 'noreg', 'permohonan', 'villages', 'districts', 'cities', 'provinces', 'detail_penawaran_1', 'id'));
|
||||
}
|
||||
|
||||
public function datatablesPenawaran(Request $request)
|
||||
@@ -414,4 +525,549 @@ class TenderController extends Controller
|
||||
// Kembalikan hasil pengecekan sebagai JSON
|
||||
return response()->json(['exists' => $exists]);
|
||||
}
|
||||
|
||||
public function downloadSuratTender($noreg)
|
||||
{
|
||||
$penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
|
||||
$permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first();
|
||||
|
||||
if ($penawaran->status != 'tender') {
|
||||
return redirect()->route('otorisasitender.penawaran.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk Otorisasi Tender tidak bisa masuk penawaran lagi!');
|
||||
}
|
||||
|
||||
foreach ($permohonan->documents as $document) {
|
||||
$village_permohonan = $document->village_code;
|
||||
$district_permohonan = $document->district_code;
|
||||
$city_permohonan = $document->city_code;
|
||||
$province_permohonan = $document->province_code;
|
||||
}
|
||||
|
||||
$villages = Village::where('code', $village_permohonan)->get();
|
||||
$districts = District::where('code', $district_permohonan)->get();
|
||||
$cities = City::where('code', $city_permohonan)->get();
|
||||
$provinces = Province::where('code', $province_permohonan)->get();
|
||||
|
||||
$pdf = app('dompdf.wrapper'); // create an instance of the PDF class
|
||||
$pdf->loadView('lpj::penawaran.surat_tender_download', compact('penawaran', 'permohonan', 'villages', 'districts', 'cities', 'provinces'));
|
||||
|
||||
return $pdf->download('surat_tender' . time() . '.pdf');
|
||||
}
|
||||
|
||||
public function downloadSuratTenderKJPP($noreg, $id)
|
||||
{
|
||||
$kjpp = KJPP::find($id);
|
||||
$penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
|
||||
$permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first();
|
||||
|
||||
if ($penawaran->status != 'tender') {
|
||||
return redirect()->route('otorisasitender.penawaran.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk Otorisasi Tender tidak bisa masuk penawaran lagi!');
|
||||
}
|
||||
|
||||
foreach ($permohonan->documents as $document) {
|
||||
$village_permohonan = $document->village_code;
|
||||
$district_permohonan = $document->district_code;
|
||||
$city_permohonan = $document->city_code;
|
||||
$province_permohonan = $document->province_code;
|
||||
}
|
||||
|
||||
$villages = Village::where('code', $village_permohonan)->get();
|
||||
$districts = District::where('code', $district_permohonan)->get();
|
||||
$cities = City::where('code', $city_permohonan)->get();
|
||||
$provinces = Province::where('code', $province_permohonan)->get();
|
||||
|
||||
$detail_penawaran = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $kjpp->id)->get();
|
||||
|
||||
foreach ($detail_penawaran as $detail) {
|
||||
$detail_penawaran_1 = $detail->kjpp;
|
||||
}
|
||||
|
||||
$pdf = app('dompdf.wrapper'); // create an instance of the PDF class
|
||||
$pdf->loadView('lpj::penawaran.surat_tender_kjpp_download', compact('penawaran', 'permohonan', 'villages', 'districts', 'cities', 'provinces', 'detail_penawaran_1'));
|
||||
|
||||
return $pdf->download('surat_tender_kjpp' . time() . '.pdf');
|
||||
}
|
||||
|
||||
// Kirim Email
|
||||
public function showKirimEmail($noreg)
|
||||
{
|
||||
$penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
|
||||
$permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first();
|
||||
|
||||
if (!$penawaran) {
|
||||
return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])
|
||||
->with('error', 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!');
|
||||
}
|
||||
|
||||
if ($penawaran->status != 'tender') {
|
||||
return redirect()->route('otorisasitender.penawaran.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk Otorisasi Tender tidak bisa masuk penawaran lagi!');
|
||||
}
|
||||
|
||||
if ($permohonan->documents->isEmpty()) {
|
||||
return redirect()->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id])
|
||||
->with('error', 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!');
|
||||
}
|
||||
|
||||
return view('lpj::penawaran.showKirimEmail', compact('penawaran', 'permohonan', 'noreg'));
|
||||
}
|
||||
|
||||
public function dataTablesShowKirimSurat(Request $request, $noreg)
|
||||
{
|
||||
if (is_null($this->user) || !$this->user->can('penawaran.view')) {
|
||||
// abort(403, 'Sorry! You are not allowed to view users.');
|
||||
}
|
||||
|
||||
$penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
|
||||
|
||||
// Retrieve data from the database
|
||||
$query = PenawaranDetailTender::query()->where('penawaran_id', '=', $penawaran->id)->with(['kjpp', 'penawaran', 'penawaran.emailTenderLog']);
|
||||
|
||||
// dd($query);
|
||||
|
||||
// Apply sorting if provided
|
||||
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||
$order = $request->get('sortOrder');
|
||||
$column = $request->get('sortField');
|
||||
|
||||
// Handle sorting for related table columns
|
||||
if ($column === 'nama_kjpp') {
|
||||
// Join with the KJPP table and sort by the name column
|
||||
$query->join('kjpp', 'detail_penawaran.kjpp_rekanan_id', '=', 'kjpp.id')
|
||||
->orderBy('kjpp.name', $order)
|
||||
->select('detail_penawaran.*'); // Select only the main table columns to avoid conflicts
|
||||
} else if ($column === 'nomor_kjpp') {
|
||||
$query->join('kjpp', 'detail_penawaran.kjpp_rekanan_id', '=', 'kjpp.id')
|
||||
->orderBy('kjpp.code', $order)
|
||||
->select('detail_penawaran.*');
|
||||
} else {
|
||||
// Sort by columns in the main table
|
||||
$query->orderBy($column, $order);
|
||||
}
|
||||
}
|
||||
|
||||
// Get the data for the current page
|
||||
$data = $query->get();
|
||||
|
||||
// add column "No"
|
||||
$i = 0;
|
||||
$j = 1;
|
||||
foreach ($data as $obj) {
|
||||
|
||||
// tanggal_permohonan
|
||||
$data[$i]->numbernya = $j;
|
||||
$i++;
|
||||
$j++;
|
||||
}
|
||||
|
||||
// Return the response data as a JSON object
|
||||
return response()->json([
|
||||
'draw' => $request->get('draw'),
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
public function kirimEmailAll($noreg)
|
||||
{
|
||||
$penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
|
||||
$permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first();
|
||||
|
||||
if (!$penawaran) {
|
||||
return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])
|
||||
->with('error', 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!');
|
||||
}
|
||||
|
||||
if ($penawaran->status != 'tender') {
|
||||
return redirect()->route('otorisasitender.penawaran.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk Otorisasi Tender tidak bisa masuk penawaran lagi!');
|
||||
}
|
||||
|
||||
if ($permohonan->documents->isEmpty()) {
|
||||
return redirect()->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id])
|
||||
->with('error', 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!');
|
||||
}
|
||||
|
||||
$detail_penawaran = PenawaranDetailTender::where('penawaran_id', '=', $penawaran->id)->get();
|
||||
|
||||
|
||||
foreach ($detail_penawaran as $detail) {
|
||||
$this->kirimEmailKJPP($noreg, $detail->kjpp_rekanan_id);
|
||||
}
|
||||
|
||||
$detail_penawaran = PenawaranDetailTender::where('penawaran_id', '=', $penawaran->id)
|
||||
->where('status', '=', 1)
|
||||
->pluck('kjpp_rekanan_id')
|
||||
->toArray();
|
||||
|
||||
|
||||
$kjpps = KJPP::whereIn('id', $detail_penawaran)
|
||||
->get()
|
||||
->map(function ($item) {
|
||||
$emails = collect(explode(',', $item->email_kantor))->filter()->unique();
|
||||
|
||||
// Parse JSON string jika ada dan tidak kosong
|
||||
if (!empty($item->detail_email_kantor) && $item->detail_email_kantor !== '[]') {
|
||||
$detail_emails = json_decode($item->detail_email_kantor, true);
|
||||
if (is_array($detail_emails)) {
|
||||
foreach ($detail_emails as $detail) {
|
||||
if (is_array($detail) && isset($detail['email_kantor'])) {
|
||||
$emails->push($detail['email_kantor']);
|
||||
} elseif (is_string($detail)) {
|
||||
$emails->push($detail);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'kjpp' => $item,
|
||||
'emails' => array_filter($emails->unique()->values()->all())
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
foreach ($permohonan->documents as $document) {
|
||||
$village_permohonan = $document->village_code;
|
||||
$district_permohonan = $document->district_code;
|
||||
$city_permohonan = $document->city_code;
|
||||
$province_permohonan = $document->province_code;
|
||||
}
|
||||
|
||||
$villages = Village::where('code', $village_permohonan)->get();
|
||||
$districts = District::where('code', $district_permohonan)->get();
|
||||
$cities = City::where('code', $city_permohonan)->get();
|
||||
$provinces = Province::where('code', $province_permohonan)->get();
|
||||
$user = auth::user();
|
||||
|
||||
$subject = 'Send Penawaran Email';
|
||||
|
||||
$body_pdf = view('lpj::penawaran.kirimEmail', [
|
||||
'penawaran' => $penawaran,
|
||||
'permohonan' => $permohonan,
|
||||
'kjpps' => $kjpps->pluck('emails')->flatten()->toArray(),
|
||||
'villages' => $villages,
|
||||
'districts' => $districts,
|
||||
'cities' => $cities,
|
||||
'provinces' => $provinces,
|
||||
'user' => $user,
|
||||
])->render();
|
||||
|
||||
// Dispatch job untuk mengirim email
|
||||
// SendPenawaranTenderJob::dispatch(
|
||||
// $kjpps->pluck('emails')->flatten()->toArray(),
|
||||
// $penawaran,
|
||||
// $permohonan,
|
||||
// $villages,
|
||||
// $districts,
|
||||
// $cities,
|
||||
// $provinces,
|
||||
// $user
|
||||
// );
|
||||
|
||||
try {
|
||||
// Proses log email untuk setiap KJPP
|
||||
foreach ($kjpps as $kjppData) {
|
||||
foreach ($kjppData['emails'] as $email) {
|
||||
// Cek log yang sudah ada
|
||||
$log = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
|
||||
->where('to_email', $email)
|
||||
->where('status', 'failed')
|
||||
->first();
|
||||
|
||||
$log1 = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
|
||||
->where('to_email', $email)
|
||||
->where('status', 'success')
|
||||
->first();
|
||||
|
||||
if ($log) {
|
||||
// Update log failed menjadi success
|
||||
$log->update([
|
||||
'penawaran_id' => $penawaran->id,
|
||||
'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name,
|
||||
'to_email' => $email,
|
||||
'subject' => $subject,
|
||||
'body_pdf' => $body_pdf,
|
||||
'status' => 'success',
|
||||
'error_message' => null,
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
} else if ($log1) {
|
||||
// Update timestamp jika sudah success
|
||||
$log1->update([
|
||||
'penawaran_id' => $penawaran->id,
|
||||
'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name,
|
||||
'to_email' => $email,
|
||||
'subject' => $subject,
|
||||
'body_pdf' => $body_pdf,
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
} else {
|
||||
// Buat log baru
|
||||
PenawaranEmailTenderLog::create([
|
||||
'penawaran_id' => $penawaran->id,
|
||||
'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name,
|
||||
'to_email' => $email,
|
||||
'subject' => $subject,
|
||||
'body_pdf' => $body_pdf,
|
||||
'status' => 'success',
|
||||
'error_message' => null,
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return redirect()->back()
|
||||
->with('success', 'Email Penawaran Berhasil Terkirim!');
|
||||
} catch (\Exception $e) {
|
||||
// Log email gagal untuk setiap KJPP
|
||||
foreach ($kjpps as $kjppData) {
|
||||
foreach ($kjppData['emails'] as $email) {
|
||||
$log = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
|
||||
->where('to_email', $email)
|
||||
->where('status', 'success')
|
||||
->first();
|
||||
|
||||
$log1 = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
|
||||
->where('to_email', $email)
|
||||
->where('status', 'failed')
|
||||
->first();
|
||||
|
||||
if ($log) {
|
||||
// Update log success menjadi failed
|
||||
$log->update([
|
||||
'penawaran_id' => $penawaran->id,
|
||||
'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name,
|
||||
'to_email' => $email,
|
||||
'subject' => $subject,
|
||||
'body_pdf' => $body_pdf,
|
||||
'status' => 'failed',
|
||||
'error_message' => $e->getMessage(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
} else if ($log1) {
|
||||
// Update error message jika sudah failed
|
||||
$log1->update([
|
||||
'penawaran_id' => $penawaran->id,
|
||||
'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name,
|
||||
'to_email' => $email,
|
||||
'subject' => $subject,
|
||||
'body_pdf' => $body_pdf,
|
||||
'error_message' => $e->getMessage(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
} else {
|
||||
// Buat log baru dengan status failed
|
||||
PenawaranEmailTenderLog::create([
|
||||
'penawaran_id' => $penawaran->id,
|
||||
'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name,
|
||||
'to_email' => $email,
|
||||
'subject' => $subject,
|
||||
'body_pdf' => $body_pdf,
|
||||
'status' => 'failed',
|
||||
'error_message' => $e->getMessage(),
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return redirect()->back()
|
||||
->with('error', 'Email Penawaran Gagal Terkirim!');
|
||||
}
|
||||
}
|
||||
|
||||
public function kirimEmailKJPP($noreg, $id)
|
||||
{
|
||||
$penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
|
||||
$permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first();
|
||||
|
||||
if (!$penawaran) {
|
||||
return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])
|
||||
->with('error', 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!');
|
||||
}
|
||||
|
||||
if ($penawaran->status != 'tender') {
|
||||
return redirect()->route('otorisasitender.penawaran.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk Otorisasi Tender tidak bisa masuk penawaran lagi!');
|
||||
}
|
||||
|
||||
if ($permohonan->documents->isEmpty()) {
|
||||
return redirect()->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id])
|
||||
->with('error', 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!');
|
||||
}
|
||||
|
||||
$detail_penawaran = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $id)->pluck('kjpp_rekanan_id')->toArray();
|
||||
$kjpps = KJPP::whereIn('id', $detail_penawaran)
|
||||
->get()
|
||||
->map(function ($item) {
|
||||
$emails = collect(explode(',', $item->email_kantor))->filter()->unique();
|
||||
|
||||
// Parse JSON string jika ada dan tidak kosong
|
||||
if (!empty($item->detail_email_kantor) && $item->detail_email_kantor !== '[]') {
|
||||
$detail_emails = json_decode($item->detail_email_kantor, true);
|
||||
if (is_array($detail_emails)) {
|
||||
foreach ($detail_emails as $detail) {
|
||||
if (is_array($detail) && isset($detail['email_kantor'])) {
|
||||
$emails->add($detail['email_kantor']);
|
||||
} elseif (is_string($detail)) {
|
||||
$emails->add($detail);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return array_filter(array_values(iterator_to_array($emails)));
|
||||
})
|
||||
->flatten()
|
||||
->unique()
|
||||
->values()
|
||||
->toArray();
|
||||
|
||||
$dp1 = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $id)->first();
|
||||
|
||||
foreach ($permohonan->documents as $document) {
|
||||
$village_permohonan = $document->village_code;
|
||||
$district_permohonan = $document->district_code;
|
||||
$city_permohonan = $document->city_code;
|
||||
$province_permohonan = $document->province_code;
|
||||
}
|
||||
|
||||
$villages = Village::where('code', $village_permohonan)->get();
|
||||
$districts = District::where('code', $district_permohonan)->get();
|
||||
$cities = City::where('code', $city_permohonan)->get();
|
||||
$provinces = Province::where('code', $province_permohonan)->get();
|
||||
$user = auth()->user();
|
||||
|
||||
$subject = 'Send Penawaran Email';
|
||||
|
||||
$body_pdf = view('lpj::penawaran.kirimEmailKJPP', [
|
||||
'dp1' => $dp1,
|
||||
'penawaran' => $penawaran,
|
||||
'permohonan' => $permohonan,
|
||||
'kjpps' => $kjpps,
|
||||
'villages' => $villages,
|
||||
'districts' => $districts,
|
||||
'cities' => $cities,
|
||||
'provinces' => $provinces,
|
||||
'user' => $user,
|
||||
])->render();
|
||||
|
||||
SendPenawaranKJPPTenderJob::dispatch(
|
||||
$kjpps,
|
||||
$dp1,
|
||||
$penawaran,
|
||||
$permohonan,
|
||||
$villages,
|
||||
$districts,
|
||||
$cities,
|
||||
$provinces,
|
||||
$user
|
||||
);
|
||||
|
||||
try {
|
||||
// Proses log email
|
||||
foreach ($kjpps as $email) {
|
||||
// Cek apakah sudah ada log dengan status 'failed' untuk email ini
|
||||
$log = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
|
||||
->where('to_email', $email)
|
||||
->where('status', 'failed')
|
||||
->first();
|
||||
|
||||
$log1 = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
|
||||
->where('to_email', $email)
|
||||
->where('status', 'success')
|
||||
->first();
|
||||
|
||||
if ($log) {
|
||||
// Jika log ditemukan dan statusnya 'failed', update status menjadi 'success'
|
||||
$log->update([
|
||||
'penawaran_id' => $penawaran->id,
|
||||
'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name,
|
||||
'to_email' => $email,
|
||||
'subject' => $subject,
|
||||
'body_pdf' => $body_pdf,
|
||||
'status' => 'success',
|
||||
'error_message' => null, // Reset error_message saat status diubah menjadi success
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
} else if ($log1) {
|
||||
// Jika log ditemukan dan statusnya 'success' biarkan saja
|
||||
$log1->update([
|
||||
'penawaran_id' => $penawaran->id,
|
||||
'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name,
|
||||
'to_email' => $email,
|
||||
'subject' => $subject,
|
||||
'body_pdf' => $body_pdf,
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
} else {
|
||||
// Jika tidak ada log gagal, buat log baru dengan status 'success'
|
||||
PenawaranEmailTenderLog::create([
|
||||
'penawaran_id' => $penawaran->id,
|
||||
'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name,
|
||||
'to_email' => $email,
|
||||
'subject' => $subject,
|
||||
'body_pdf' => $body_pdf,
|
||||
'status' => 'success',
|
||||
'error_message' => null, // Tidak ada error message
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return redirect()->back()->with('success', 'Email Penawaran Berhasil Terkirim!');
|
||||
} catch (\Exception $e) {
|
||||
// Log email gagal
|
||||
foreach ($kjpps as $email) {
|
||||
$log = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
|
||||
->where('to_email', $email)
|
||||
->where('status', 'success')
|
||||
->first();
|
||||
|
||||
$log1 = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
|
||||
->where('to_email', $email)
|
||||
->where('status', 'failed')
|
||||
->first();
|
||||
|
||||
if ($log) {
|
||||
// Jika log ditemukan dan statusnya 'success', update status menjadi 'failed'
|
||||
$log->update([
|
||||
'penawaran_id' => $penawaran->id,
|
||||
'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name,
|
||||
'to_email' => $email,
|
||||
'subject' => $subject,
|
||||
'body_pdf' => $body_pdf,
|
||||
'status' => 'failed',
|
||||
'error_message' => $e->getMessage(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
} else if ($log1) {
|
||||
// Jika log ditemukan dan statusnya 'failed' biarkan saja
|
||||
$log1->update([
|
||||
'penawaran_id' => $penawaran->id,
|
||||
'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name,
|
||||
'to_email' => $email,
|
||||
'subject' => $subject,
|
||||
'body_pdf' => $body_pdf,
|
||||
'error_message' => $e->getMessage(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
} else {
|
||||
PenawaranEmailTenderLog::create([
|
||||
'penawaran_id' => $penawaran->id,
|
||||
'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name,
|
||||
'to_email' => $email,
|
||||
'subject' => $subject,
|
||||
'body_pdf' => $body_pdf,
|
||||
'status' => 'failed',
|
||||
'error_message' => $e->getMessage(),
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
return redirect()->back()->with('error', 'Email Penawaran Gagal Terkirim!');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
57
app/Http/Requests/BankDataRequest.php
Normal file
57
app/Http/Requests/BankDataRequest.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class BankDataRequest extends FormRequest
|
||||
{
|
||||
public function authorize()
|
||||
{
|
||||
return true; // Adjust this based on your authorization logic
|
||||
}
|
||||
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'address' => 'nullable|string|max:255',
|
||||
'village_code' => 'nullable|string|max:20',
|
||||
'district_code' => 'nullable|string|max:20',
|
||||
'city_code' => 'nullable|string|max:20',
|
||||
'province_code' => 'nullable|string|max:20',
|
||||
'tahun' => 'nullable|integer',
|
||||
'luas_tanah' => 'nullable|numeric',
|
||||
'luas_bangunan' => 'nullable|numeric',
|
||||
'tahun_bangunan' => 'nullable|integer',
|
||||
'status_nara_sumber' => 'nullable|string|max:50',
|
||||
'harga' => 'nullable|numeric',
|
||||
'harga_diskon' => 'nullable|numeric',
|
||||
'diskon' => 'nullable|numeric',
|
||||
'total' => 'nullable|numeric',
|
||||
'nama_nara_sumber' => 'nullable|string|max:100',
|
||||
'peruntukan' => 'nullable|string|max:100',
|
||||
'penawaran' => 'nullable|string|max:50',
|
||||
'telepon' => 'nullable|string|max:20',
|
||||
'hak_properti' => 'nullable|string|max:50',
|
||||
'kordinat_lat' => 'nullable|numeric',
|
||||
'kordinat_lng' => 'nullable|numeric',
|
||||
'jenis_aset' => 'nullable|string|max:50',
|
||||
'foto_objek' => 'nullable|image|max:2048',
|
||||
'tanggal' => 'nullable|date',
|
||||
'harga_penawaran' => 'nullable|numeric',
|
||||
'nomor_laporan' => 'nullable|string|max:50',
|
||||
'tgl_final_laporan' => 'nullable|date',
|
||||
'nilai_pasar' => 'nullable|numeric',
|
||||
'indikasi_nilai_likuidasi' => 'nullable|numeric',
|
||||
'indikasi_nilai_pasar_tanah' => 'nullable|numeric',
|
||||
'estimasi_harga_tanah' => 'nullable|numeric',
|
||||
'estimasi_harga_bangunan' => 'nullable|numeric',
|
||||
'indikasi_nilai_pasar_bangunan' => 'nullable|numeric',
|
||||
'indikasi_nilai_pasar_sarana_pelengkap' => 'nullable|numeric',
|
||||
'indikasi_nilai_pasar_mesin' => 'nullable|numeric',
|
||||
'indikasi_nilai_pasar_kendaraan_alat_berat' => 'nullable|numeric',
|
||||
'photos' => 'nullable|array',
|
||||
'photos.*' => 'nullable|image|max:2048',
|
||||
];
|
||||
}
|
||||
}
|
||||
33
app/Http/Requests/CategoryDaftarPustakaRequest.php
Normal file
33
app/Http/Requests/CategoryDaftarPustakaRequest.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class CategoryDaftarPustakaRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
$rules = [
|
||||
'name' => 'required|max:255',
|
||||
];
|
||||
|
||||
if ($this->method() == 'PUT') {
|
||||
$rules['code'] = 'required|max:50|unique:category_daftar_pustaka,code,' . $this->id;
|
||||
} else {
|
||||
$rules['code'] = 'required|max:50|unique:category_daftar_pustaka,code';
|
||||
}
|
||||
return $rules;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
58
app/Http/Requests/CustomFieldRequest.php
Normal file
58
app/Http/Requests/CustomFieldRequest.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Modules\Lpj\Models\CustomField;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class CustomFieldRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'name' => 'required|max:255',
|
||||
'type' => 'required|in:text,select,radio,checkbox,date,number',
|
||||
'label' => 'nullable|max:255',
|
||||
'urutan_prioritas' => [
|
||||
'nullable',
|
||||
'integer',
|
||||
Rule::unique('custom_fields')->ignore($this->route('custom_field')),
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function prepareValidationData($data){
|
||||
if(!$this->type){
|
||||
$this->merge(['type' => 'text']);
|
||||
}
|
||||
|
||||
if (!$this->urutan_prioritas) {
|
||||
$maxPrioritas = CustomField::max('urutan_prioritas') ?? 0;
|
||||
$this->merge(['urutan_prioritas' => $maxPrioritas + 1]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get custom messages for validator errors.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function messages()
|
||||
{
|
||||
return [
|
||||
'urutan_prioritas.unique' => 'Urutan prioritas sudah digunakan. Silakan pilih nomor lain.',
|
||||
];
|
||||
}
|
||||
}
|
||||
38
app/Http/Requests/DaftarPustakaRequest.php
Normal file
38
app/Http/Requests/DaftarPustakaRequest.php
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class DaftarPustakaRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
|
||||
$rules = [
|
||||
'judul' => 'required|max:255',
|
||||
'category_id' => 'required',
|
||||
'deskripsi' => 'nullable',
|
||||
];
|
||||
|
||||
if ($this->method() == 'PUT') {
|
||||
$rules['attachment'] = 'nullable|mimes:pdf,jpg,jpeg,png,gif';
|
||||
} else {
|
||||
$rules['attachment'] = 'required|mimes:pdf,jpg,jpeg,png,gif';
|
||||
}
|
||||
|
||||
return $rules;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -13,16 +13,17 @@
|
||||
: array
|
||||
{
|
||||
$rules = [
|
||||
'debiture_id' => 'required|exists:debitures,id',
|
||||
'pemilik_jaminan_id' => 'required',
|
||||
'jenis_jaminan_id' => 'required',
|
||||
'province_code' => 'nullable|exists:provinces,code',
|
||||
'city_code' => 'nullable|exists:cities,code',
|
||||
'district_code' => 'nullable|exists:districts,code',
|
||||
'village_code' => 'nullable|exists:villages,code',
|
||||
'address' => 'nullable|string',
|
||||
'postal_code' => 'nullable|string|max:10',
|
||||
'status' => 'nullable|boolean',
|
||||
'debiture_id' => 'required|exists:debitures,id',
|
||||
'permohonan_id' => 'required|exists:permohonan,id',
|
||||
'pemilik_jaminan_id' => 'required',
|
||||
'jenis_jaminan_id' => 'required',
|
||||
'province_code' => 'nullable|exists:provinces,code',
|
||||
'city_code' => 'nullable|exists:cities,code',
|
||||
'district_code' => 'nullable|exists:districts,code',
|
||||
'village_code' => 'nullable|exists:villages,code',
|
||||
'address' => 'nullable|string',
|
||||
'postal_code' => 'nullable|string|max:10',
|
||||
'status' => 'nullable|boolean',
|
||||
];
|
||||
|
||||
return $rules;
|
||||
|
||||
@@ -19,57 +19,9 @@ class FormSurveyorRequest extends FormRequest
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
$commonRules = $this->getCommonRules();
|
||||
|
||||
$actionSpecificRules = $this->getActionSpecificRules();
|
||||
|
||||
return array_merge($commonRules, $actionSpecificRules);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get common rules that apply to all actions.
|
||||
*/
|
||||
private function getCommonRules(): array
|
||||
{
|
||||
return [
|
||||
'jenis_jaminan_id' => 'required',
|
||||
'type' => 'required',
|
||||
'permohonan_id' => 'required',
|
||||
'luas' => 'required',
|
||||
'jarak_jalan_utama' => 'required',
|
||||
'alamat' => 'required',
|
||||
'jarak_cbd_point' => 'required',
|
||||
'lebar_perkerasan_jalan' => 'required',
|
||||
'perkerasan_jalan' => 'required',
|
||||
'lalu_lintas' => 'required',
|
||||
'gol_mas_sekitar' => 'required',
|
||||
'tingkat_keramaian' => 'required',
|
||||
'terletak_diarea' => 'required',
|
||||
'disekitar_lokasi' => 'required',
|
||||
'dekat_makam' => 'required',
|
||||
'dekat_tps' => 'required',
|
||||
'merupakan_daerah' => 'required',
|
||||
'fasilitas_dekat_object' => 'required',
|
||||
'fakta_positif' => 'required',
|
||||
'fakta_negatif' => 'required',
|
||||
'rute_menuju' => 'required',
|
||||
'batas_batas' => 'required',
|
||||
'kondisi_linkungan' => 'required',
|
||||
'kondisi_lain_bangunan' => 'required',
|
||||
'informasi_dokument' => 'required',
|
||||
'peruntukan' => 'required',
|
||||
'kdb' => 'required',
|
||||
'kdh' => 'required',
|
||||
'gsb' => 'required',
|
||||
'max_lantai' => 'required',
|
||||
'klb' => 'required',
|
||||
'gss' => 'required',
|
||||
'pelebaran_jalan' => 'required',
|
||||
'nama_petugas' => 'required',
|
||||
'lat' => 'required|numeric',
|
||||
'lng' => 'required|numeric',
|
||||
'foto_tempat' => 'required',
|
||||
'keterangan' => 'required',
|
||||
];
|
||||
return $actionSpecificRules;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -78,56 +30,670 @@ class FormSurveyorRequest extends FormRequest
|
||||
private function getActionSpecificRules(): array
|
||||
{
|
||||
$action = $this->input('action');
|
||||
$pisah = explode(',', $action);
|
||||
|
||||
switch ($action) {
|
||||
case 'tanah_bangunan':
|
||||
return $this->getTanahBangunanRules();
|
||||
case 'unit':
|
||||
return $this->getUnitRules();
|
||||
default:
|
||||
return [];
|
||||
$allRules = [
|
||||
'tanah' => $this->getTanahRules(),
|
||||
'bangunan' => $this->getBangunanRules(),
|
||||
'kapal' => $this->getKapalRules(),
|
||||
'kendaraan' => $this->getKendaraanRules(),
|
||||
'mesin' => $this->getMesinRules(),
|
||||
'pesawat' => $this->getPesawatRules(),
|
||||
'alat-berat' => $this->getAlatBeratRules(),
|
||||
'apartemen-kantor' => $this->getUnitRules(),
|
||||
'lingkungan' => $this->getLinkunganRules(),
|
||||
'fakta' => $this->getCommonRules(),
|
||||
'rap' => $this->getRapRules()
|
||||
];
|
||||
|
||||
$rules = [];
|
||||
$hasAssetDescriptionRules = false;
|
||||
|
||||
foreach ($pisah as $act) {
|
||||
if (isset($allRules[$act])) {
|
||||
$rules = array_merge($rules, $allRules[$act]);
|
||||
if ($act == 'tanah' || $act == 'bangunan' || $act == 'apartemen-kantor' || $act == 'rap') {
|
||||
$hasAssetDescriptionRules = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($hasAssetDescriptionRules) {
|
||||
$rules = array_merge($rules, $this->getAssetDescriptionRules());
|
||||
}
|
||||
|
||||
return $rules;
|
||||
}
|
||||
/**
|
||||
* Get rules specific to tanah_bangunan action.
|
||||
* Get rules specific to tanah action.
|
||||
*/
|
||||
private function getTanahBangunanRules(): array
|
||||
|
||||
public function getTanahRules(): array
|
||||
{
|
||||
return [
|
||||
'action' => 'required',
|
||||
'bentuk_tanah' => 'required',
|
||||
'kontur_tanah' => 'required',
|
||||
'posisi_kavling' => 'required',
|
||||
'ketinggian_jalan' => 'required',
|
||||
'kondisi_fisik_tanah' => 'required',
|
||||
return [
|
||||
'luas_tanah' => 'required',
|
||||
'luas_tanah_sesuai' => 'nullable',
|
||||
'luas_tanah_tidak_sesuai' => 'nullable',
|
||||
'hadap_mata_angin' => 'required',
|
||||
'hadap_mata_angin_sesuai' => 'nullable',
|
||||
'hadap_mata_angin_tidak_sesuai' => 'nullable',
|
||||
'bentuk_tanah' => 'required|array',
|
||||
'bentuk_tanah_lainnya' => 'nullable',
|
||||
'kontur_tanah' => 'required|array',
|
||||
'ketinggian_jalan' => 'required|array',
|
||||
'kontur_jalan' => 'required',
|
||||
'kondisi_bangunan' => 'required',
|
||||
'sifat_bangunan' => 'required',
|
||||
'sarana_pelengkap' => 'required',
|
||||
'luas_tanah_bagunan' => 'required',
|
||||
'posisi_kavling' => 'required|array',
|
||||
'posisi_kavling_lainnya' => 'nullable',
|
||||
'tusuk_sate' => 'required',
|
||||
'name.*' => 'required|string',
|
||||
'kategori.*' => 'required|string',
|
||||
'lockland' => 'required',
|
||||
'jenis_bangunan' => 'required',
|
||||
'kondisi_bangunan' => 'required',
|
||||
'kondisi_fisik_tanah' => 'required|array',
|
||||
'ketinggian_lebih_tinggi' => 'nullable',
|
||||
'ketinggian_lebih_rendah' => 'nullable',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get rules specific to unit action.
|
||||
* Get rules specific to Bangunan action.
|
||||
*/
|
||||
|
||||
private function getBangunanRules(): array
|
||||
{
|
||||
return [
|
||||
'action' => 'required',
|
||||
'luas_tanah_bangunan_sesuai' => 'nullable',
|
||||
'luas_tanah_bagunan' => 'required',
|
||||
'luas_tanah_bangunan_tidak_sesuai' => 'nullable',
|
||||
'jenis_bangunan' => 'required|array',
|
||||
'kondisi_bangunan' => 'required|array',
|
||||
'sifat_bangunan' => 'required|array',
|
||||
'sifat_bangunan_input' => 'nullable|array',
|
||||
|
||||
|
||||
'nama_bangunan.*' => 'required|string|max:255',
|
||||
'spek_kategori_bangunan.*' => 'nullable|string',
|
||||
'spek_bangunan.*.*.lainnya' => 'nullable|string',
|
||||
|
||||
'sarana_pelengkap' => 'required',
|
||||
'sarana_pelengkap_input' => 'nullable|array',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get rules specific to unit action.
|
||||
*/
|
||||
private function getUnitRules(): array
|
||||
{
|
||||
return [
|
||||
return [
|
||||
'action' => 'required',
|
||||
'jenis_unit' => 'required',
|
||||
'kondisi_unit' => 'required',
|
||||
'posisi_unit' => 'required',
|
||||
'lantai' => 'required',
|
||||
'view' => 'required',
|
||||
'bentuk_unit' => 'required',
|
||||
'luas_unit' => 'required',
|
||||
'luas_unit_sesuai' => 'nullable',
|
||||
'luas_unit_tidak_sesuai' => 'nullable',
|
||||
'kondisi_unit' => 'required|array',
|
||||
'posisi_unit' => 'required|array',
|
||||
'lantai' => 'required|array',
|
||||
'view' => 'required|array',
|
||||
'bentuk_unit' => 'required|array',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get rules specific to Linkungan action.
|
||||
*/
|
||||
|
||||
private function getLinkunganRules(): array
|
||||
{
|
||||
return [
|
||||
'action' => 'required',
|
||||
'jarak_jalan_utama' => 'nullable',
|
||||
'jalan_linkungan' => 'nullable',
|
||||
'jarak_cbd_point' => 'nullable',
|
||||
'nama_cbd_point' => 'nullable',
|
||||
'lebar_perkerasan_jalan' => 'nullable',
|
||||
'perkerasan_jalan' => 'nullable|array',
|
||||
'perkerasan_jalan_lainnya' => 'nullable',
|
||||
'lalu_lintas' => 'nullable',
|
||||
'gol_mas_sekitar' => 'nullable',
|
||||
'tingkat_keramaian' => 'nullable',
|
||||
'terletak_diarea' => 'nullable',
|
||||
'terletak_diarea_lainnya' => 'nullable',
|
||||
'disekitar_lokasi' => 'required',
|
||||
'kondisi_bagunan_disekitar_lokasi' => 'nullable',
|
||||
'sifat_bagunan_disekitar_lokasi' => 'nullable',
|
||||
'dekat_makam' => 'nullable',
|
||||
'jarak_makam' => 'nullable',
|
||||
'nama_makam' => 'nullable',
|
||||
'dekat_tps' => 'nullable',
|
||||
'jarak_tps' => 'nullable',
|
||||
'nama_tpu' => 'nullable',
|
||||
'dekat_lainnya' => 'nullable',
|
||||
'merupakan_daerah' => 'nullable',
|
||||
'fasilitas_dekat_object' => 'nullable|array',
|
||||
'fasilitas_dekat_object_input' => 'nullable|array',
|
||||
];
|
||||
}
|
||||
|
||||
private function getKapalRules(): array
|
||||
{
|
||||
return [
|
||||
'action' => 'required',
|
||||
'nama_wakil_debitur' => 'nullable',
|
||||
'hub_calon_debitur' => 'required',
|
||||
'dermaga' => 'nullable',
|
||||
'nama_jalan' => 'required',
|
||||
'perumahan_gang' => 'required',
|
||||
'blok_nomor' => 'required',
|
||||
|
||||
'village_code' => 'nullable|string',
|
||||
'district_code' => 'nullable|string',
|
||||
'city_code' => 'nullable|string',
|
||||
'province_code' => 'nullable|string',
|
||||
|
||||
'jenis_kapal' => 'required',
|
||||
'jenis_kapal_lainnya' => 'nullable',
|
||||
'size' => 'required',
|
||||
'kondisi' => 'required',
|
||||
'klasifikasi' => 'required',
|
||||
|
||||
'nama_kapal' => 'required',
|
||||
'pemilik_kapal' => 'required',
|
||||
'bendera' => 'required',
|
||||
'nomor_selar' => 'required',
|
||||
'kapal' => 'required',
|
||||
'galangan_kapal' => 'required',
|
||||
'kapal_shipyard' => 'required',
|
||||
'tahun_pembuatan' => 'required',
|
||||
'tahun_launcing' => 'required',
|
||||
'dwt' => 'required',
|
||||
'lwt' => 'required',
|
||||
'gross_tonnage' => 'required',
|
||||
'net_tonnage' => 'required',
|
||||
'tenaga_mesin' => 'required',
|
||||
'loa' => 'required',
|
||||
'lbp' => 'required',
|
||||
'beam' => 'required',
|
||||
'depth' => 'required',
|
||||
'draft' => 'required',
|
||||
|
||||
'lambung_kapal' => 'required',
|
||||
'dek' => 'required',
|
||||
'struktur_rangka' => 'required',
|
||||
'palka' => 'required',
|
||||
'pondasi_mesin' => 'required',
|
||||
'area_mesin' => 'required',
|
||||
'cat_dan_korosi' => 'required',
|
||||
'sistem_pengelasan' => 'required',
|
||||
'deskripsi_struktur' => 'required',
|
||||
|
||||
'sekoci' => 'required',
|
||||
'jaket_pelampung' => 'required',
|
||||
'alat_pemadaman' => 'required',
|
||||
'rambu_darurat' => 'required',
|
||||
'sistem_alarm' => 'required',
|
||||
'sistem_pencegah' => 'required',
|
||||
'kebakaran' => 'required',
|
||||
'lampu_darurat' => 'required',
|
||||
'deskripsi_peralatan' => 'required',
|
||||
|
||||
'gps' => 'required',
|
||||
'radar' => 'required',
|
||||
'radio_komunikasi' => 'required',
|
||||
'lampu_navigasi' => 'required',
|
||||
'sistem_kendali_otomatis' => 'required',
|
||||
'kompas' => 'required',
|
||||
'deskripsi_navigasi' => 'required',
|
||||
|
||||
'mesin_utama' => 'required',
|
||||
'mesin_bantu' => 'required',
|
||||
'pompa_pendingin' => 'required',
|
||||
'sistem_pelumasan' => 'required',
|
||||
'propeller' => 'required',
|
||||
'sistem_kelistrikan' => 'required',
|
||||
'deskripsi_mesin_penggerak' => 'required',
|
||||
|
||||
'lampu_navigasi' => 'required',
|
||||
'sistem_penerangan' => 'required',
|
||||
'sistem_panel_distribusi' => 'required',
|
||||
'kabel_perangkat' => 'required',
|
||||
'deskripsi_kelistrikan' => 'required',
|
||||
|
||||
'kebersihan_dek_luar' => 'nullable',
|
||||
'tangki_limbah' => 'nullable',
|
||||
'sistem_pengelolaan_limbah' => 'nullable',
|
||||
'pengelolaan_air_ballast' => 'nullable',
|
||||
'deskripsi_kebersihan' => 'required',
|
||||
|
||||
'fakta_positif.*' => 'nullable',
|
||||
'fakta_negatif.*' => 'nullable',
|
||||
'analisa_makro.*' => 'nullable',
|
||||
'kesimpulan.*' => 'nullable',
|
||||
'catatan.*' => 'nullable',
|
||||
];
|
||||
}
|
||||
|
||||
public function getKendaraanRules(): array
|
||||
{
|
||||
return [
|
||||
'action' => 'required',
|
||||
'tanggal_survey' => 'required',
|
||||
'nama_wakil' => 'required',
|
||||
'hub_calon_debitur' => 'required',
|
||||
'nama_jalan' => 'required',
|
||||
'perumahan_gang' => 'required',
|
||||
'blok_nomor' => 'required',
|
||||
|
||||
'village_code' => 'nullable|string',
|
||||
'district_code' => 'nullable|string',
|
||||
'city_code' => 'nullable|string',
|
||||
'province_code' => 'nullable|string',
|
||||
|
||||
'masa_stnk' => 'required',
|
||||
'masa_pajak' => 'required',
|
||||
'kendaraan.*' => 'required',
|
||||
'kendaraan_input.*' => 'nullable',
|
||||
'kondisi' => 'required',
|
||||
'nomor_polisi' => 'required',
|
||||
'nomor_polis_tidak_sesuai' => 'nullable',
|
||||
'merek' => 'required',
|
||||
'merek_tidak_sesuai' => 'nullable',
|
||||
'warna' => 'required',
|
||||
'warna_tidak_sesuai' => 'nullable',
|
||||
'nomor_rangka' => 'required',
|
||||
'nomor_rangka_tidak_sesuai' => 'nullable',
|
||||
'nomor_mesin' => 'required',
|
||||
'nomor_mesin_tidak_sesuai' => 'nullable',
|
||||
'posisi_kilometer' => 'required',
|
||||
'transmisi' => 'required',
|
||||
'transmisi_input' => 'nullable',
|
||||
'mesin_panel_instrument.*' => 'required',
|
||||
'mesin_panel_instrument_input.*' => 'nullable',
|
||||
'fungsi_mesin_panel_instrument.*' => 'required',
|
||||
'fungsi_mesin_panel_instrument_input.*' => 'nullable',
|
||||
'interior.*' => 'required',
|
||||
'interior_input.*' => 'nullable',
|
||||
'jumlah_pintu.*' => 'required',
|
||||
'jumlah_pintu_input.*' => 'nullable',
|
||||
'rangka_karoseri.*' => 'required',
|
||||
'rangka_karoseri_input.*' => 'nullable',
|
||||
'ban.*' => 'required',
|
||||
'ban_input.*' => 'nullable',
|
||||
'velg.*' => 'required',
|
||||
'velg_input.*' => 'nullable',
|
||||
'bamper_depan.*' => 'required',
|
||||
'bamper_depan_input.*' => 'nullable',
|
||||
'bamper_belakang.*' => 'required',
|
||||
'bamper_belakang_input.*' => 'nullable',
|
||||
'lampu_depan.*' => 'required',
|
||||
'lampu_depan_input.*' => 'nullable',
|
||||
'lampu_belakang.*' => 'required',
|
||||
'lampu_belakang_input.*' => 'nullable',
|
||||
'kaca_kendaraan.*' => 'required',
|
||||
'kaca_kendaraan_input.*' => 'nullable',
|
||||
'air_conditioner.*' => 'required',
|
||||
'air_conditioner_input.*' => 'nullable',
|
||||
'tape_radio_cd.*' => 'required',
|
||||
'tape_radio_cd_input.*' => 'nullable',
|
||||
'sensor_parkir.*' => 'required',
|
||||
'sensor_parkir_input.*' => 'nullable',
|
||||
'sensor_camera_recorder.*' => 'required',
|
||||
'sensor_camera_recorder_input.*' => 'nullable',
|
||||
'lcd.*' => 'required',
|
||||
'lcd_input.*' => 'nullable',
|
||||
'sabuk_keselamatan.*' => 'required',
|
||||
'sabuk_keselamatan_input.*' => 'nullable',
|
||||
'airbag.*' => 'required',
|
||||
'airbag_input.*' => 'nullable',
|
||||
'asuransi.*' => 'required',
|
||||
'asuransi_input.*' => 'nullable',
|
||||
'perusahaan_asuransi' => 'required',
|
||||
'tahun_berakhir' => 'required',
|
||||
'fakta_positif.*' => 'nullable',
|
||||
'fakta_negatif.*' => 'nullable',
|
||||
'analisa_makro.*' => 'nullable',
|
||||
'kesimpulan.*' => 'nullable',
|
||||
'catatan.*' => 'nullable',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
public function getMesinRules(): array
|
||||
{
|
||||
return [
|
||||
'action' => 'required',
|
||||
'nama_wakil' => 'required',
|
||||
'nama_jalan' => 'required',
|
||||
'perumahan_gang' => 'required',
|
||||
'blok' => 'required',
|
||||
'desa_kelurahan' => 'required',
|
||||
'kecamatan' => 'required',
|
||||
'kota_madya' => 'required',
|
||||
'provinsi' => 'required',
|
||||
'hub_calon_debitur' => 'required',
|
||||
'tipe_model' => 'required',
|
||||
'merek' => 'required',
|
||||
'tahun_pembuatan' => 'required',
|
||||
'negara_pembuat' => 'required',
|
||||
'kondisi_mesin' => 'required',
|
||||
'faktor_positif' => 'nullable',
|
||||
'faktor_negatif' => 'nullable',
|
||||
'kesimpulan' => 'nullable',
|
||||
'catatan' => 'nullable',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
public function getAlatBeratRules(): array
|
||||
{
|
||||
return [
|
||||
'action' => 'required',
|
||||
'nama_wakil' => 'required|string',
|
||||
'hub_calon_debitur' => 'required|string',
|
||||
'nama_jalan' => 'required',
|
||||
'perumahan_gang' => 'required',
|
||||
'blok_nomor' => 'required',
|
||||
'village_code' => 'nullable|string',
|
||||
'district_code' => 'nullable|string',
|
||||
'city_code' => 'nullable|string',
|
||||
'province_code' => 'nullable|string',
|
||||
'jenis_model' => 'required',
|
||||
'nomor_lambung' => 'required',
|
||||
'model_unit' => 'required',
|
||||
'tahun_pembuatan' => 'required',
|
||||
'merk' => 'required',
|
||||
'negara_pembuat' => 'required',
|
||||
'tahun_pembelian' => 'required',
|
||||
'nomor_faktur' => 'nullable',
|
||||
'nomor_kontrak' => 'nullable',
|
||||
'nama_pemilik' => 'nullable',
|
||||
'alamat_pemilik' => 'nullable',
|
||||
'nomor_asuransi' => 'nullable',
|
||||
'nomor_rangka' => 'nullable',
|
||||
'nomor_mesin' => 'nullable',
|
||||
'hour_mesters' => 'nullable',
|
||||
'overhaul_mesin' => 'nullable',
|
||||
|
||||
'mesin_panel.*' => 'nullable',
|
||||
'mesin_panel_input.*' => 'nullable',
|
||||
'fungsi_panel.*' => 'nullable',
|
||||
'fungsi_panel_input.*' => 'nullable',
|
||||
'interior.*' => 'nullable',
|
||||
'interior_input.*' => 'nullable',
|
||||
'rangka_Karoseri.*' => 'nullable',
|
||||
'rangka_Karoseri_input.*' => 'nullable',
|
||||
'ban.*' => 'nullable',
|
||||
'ban_innput.*' => 'nullable',
|
||||
'velg.*' => 'nullable',
|
||||
'velg_input.*' => 'nullable',
|
||||
'air_conditioner.*' => 'nullable',
|
||||
'air_conditioner_input.*' => 'nullable',
|
||||
'aksesoris.*' => 'nullable',
|
||||
'aksesoris_input.*' => 'nullable',
|
||||
'lcd.*' => 'nullable',
|
||||
'lcd_innput.*' => 'nullable',
|
||||
'perlengkapan.*' => 'nullable',
|
||||
'perlengkapan_input.*' => 'nullable',
|
||||
'asuransi.*' => 'nullable',
|
||||
'asuransi_input.*' => 'nullable',
|
||||
'perusahaan_asuransi' => 'nullable',
|
||||
'tahun_berakhir.*' => 'nullable',
|
||||
'sensor_kamera.*' => 'nullable',
|
||||
'lcd.*' => 'nullable',
|
||||
'sabuk_keselamatan.*' => 'nullable',
|
||||
'air_bag.*' => 'nullable',
|
||||
'asuransi.*' => 'nullable',
|
||||
'perusahan_asuransi' => 'nullable',
|
||||
'tahun_berakhir' => 'nullable',
|
||||
'fakta_positif' => 'nullable|array',
|
||||
'fakta_negatif' => 'nullable|array',
|
||||
'kesimpulan' => 'nullable',
|
||||
'catatan' => 'nullable|array',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
|
||||
private function getPesawatRules(): array
|
||||
{
|
||||
return [
|
||||
'action' => 'required',
|
||||
'nama_wakil' => 'required|string',
|
||||
'hub_calon_debitur' => 'required|string',
|
||||
'nama_jalan' => 'required',
|
||||
'perumahan_gang' => 'required',
|
||||
'blok_nomor' => 'required',
|
||||
|
||||
'village_code' => 'nullable|string',
|
||||
'district_code' => 'nullable|string',
|
||||
'city_code' => 'nullable|string',
|
||||
'province_code' => 'nullable|string',
|
||||
|
||||
'jenis_pesawat' => 'required',
|
||||
'jenis_pesawat_lainnya' => 'nullable',
|
||||
'size' => 'required',
|
||||
'kondisi' => 'required',
|
||||
'nama_pesawat' => 'required',
|
||||
'model' => 'required',
|
||||
'nomor_registrasi' => 'required',
|
||||
'tahun_pembuatan' => 'required',
|
||||
'certificate_of_airworthines' => 'required',
|
||||
'certificate_of_registration' => 'required',
|
||||
'total_service_hours' => 'required',
|
||||
'total_service_cycles' => 'required',
|
||||
|
||||
'last_a_check' => 'required',
|
||||
'next_a_check' => 'required',
|
||||
'last_b_check' => 'required',
|
||||
'next_b_check' => 'required',
|
||||
'last_c_check' => 'required',
|
||||
'next_c_check' => 'required',
|
||||
'next_d_check' => 'required',
|
||||
'last_d_check' => 'required',
|
||||
'deskripsi_maintenence' => 'nullable',
|
||||
|
||||
'instrument_landing_system' => 'required',
|
||||
'traffic_collision_avoidance_system' => 'required',
|
||||
'windshear' => 'required',
|
||||
'electronic_flight' => 'required',
|
||||
'winglets' => 'required',
|
||||
'deskripsi_konfigurasi' => 'required',
|
||||
|
||||
|
||||
'maksimal_penumpang' => 'required',
|
||||
'jumlah_kursi' => 'required',
|
||||
'kursi_pramugari_pramugara' => 'required',
|
||||
'kartu_fitur_keselamatan' => 'required',
|
||||
'sabuk_pengaman' => 'required',
|
||||
'lampu_kabin' => 'required',
|
||||
'lampu_pintu_keluar' => 'required',
|
||||
'intercom_kabin' => 'required',
|
||||
'deskripsi_kabin' => 'required',
|
||||
|
||||
|
||||
'badan_pesawat' => 'nullable',
|
||||
'sayap_pesawat' => 'required',
|
||||
'ekor_pesawat' => 'required',
|
||||
'landing_gear' => 'required',
|
||||
'sabuk_pengaman' => 'required',
|
||||
'sistem_pengelasan' => 'required',
|
||||
'deskripsi_struktur' => 'required',
|
||||
|
||||
'gps' => 'required',
|
||||
'radar' => 'required',
|
||||
'radio_komunikasi' => 'required',
|
||||
'lampu_navigasi' => 'required',
|
||||
'sistem_autopilot' => 'required',
|
||||
'deskripsi_navigasi' => 'required',
|
||||
|
||||
'tangki_bahan_bakar' => 'required',
|
||||
'saluran_pipa_bahan_bakar' => 'required',
|
||||
'pompa_bahan_bakar' => 'required',
|
||||
'sistem_hidrolik_utama' => 'required',
|
||||
'sistem_pendigin_hidrolik' => 'required',
|
||||
'deskripsi_hidrolik' => 'required',
|
||||
|
||||
'mesin_utama' => 'required',
|
||||
'sistem_pendorong' => 'required',
|
||||
'sistem_pendigin_mesin' => 'required',
|
||||
'sistem_pelumasan' => 'required',
|
||||
'filter_dan_perangkat_pendukung' => 'required',
|
||||
'deskripsi_kondisi_mesin' => 'required',
|
||||
|
||||
|
||||
'jaket_pelampung' => 'required',
|
||||
'pintu_darurat' => 'required',
|
||||
'alat_pemadaman_kebakaran' => 'required',
|
||||
'sistem_alaram_darurat' => 'required',
|
||||
'sekoci' => 'required',
|
||||
'masker_oxigen' => 'required',
|
||||
'sabuk_pengaman' => 'required',
|
||||
'deskripsi_fungsi_keselamatan' => 'required',
|
||||
|
||||
|
||||
'sistem_ventilasi_ac' => 'required',
|
||||
'sistem_penerangan_kabin' => 'required',
|
||||
'panel_informasi_penumpang' => 'required',
|
||||
'sistem_hiburan_kabin' => 'required',
|
||||
'deskripsi_Interior' => 'required',
|
||||
|
||||
'fakta_positif' => 'nullable|array',
|
||||
'fakta_negatif' => 'nullable|array',
|
||||
'kesimpulan' => 'nullable',
|
||||
'catatan' => 'nullable|array',
|
||||
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
private function getAssetDescriptionRules(): array
|
||||
{
|
||||
return [
|
||||
'permohonan_id' => 'required',
|
||||
'dokument_id' => 'required',
|
||||
'type' => 'required',
|
||||
'nomor_registrasi' => 'required',
|
||||
'debitur_perwakilan' => 'required|array',
|
||||
'jenis_asset_name' => 'nullable|',
|
||||
'jenis_asset' => 'required',
|
||||
'jenis_asset_tidak_sesuai' => 'nullable|string',
|
||||
'alamat_sesuai' => 'required',
|
||||
'alamat_tidak_sesuai' => 'nullable|string',
|
||||
'pihak_bank' => 'nullable|string',
|
||||
'nomor_nib' => 'nullable|string',
|
||||
'hub_cadeb' => 'nullable|string',
|
||||
'hub_cadeb_sesuai' => 'nullable|string',
|
||||
'hub_cadeb_tidak_sesuai' => 'nullable|string',
|
||||
'hub_cadeb_penghuni' => 'nullable',
|
||||
'hub_cadeb_penghuni_sesuai' => 'nullable|string',
|
||||
'hub_penghuni_tidak_sesuai' => 'nullable|string',
|
||||
|
||||
'address' => 'nullable|string',
|
||||
'village_code' => 'nullable|string',
|
||||
'district_code' => 'nullable|string',
|
||||
'city_code' => 'nullable|string',
|
||||
'province_code' => 'nullable|string',
|
||||
'kordinat_lng' => 'nullable|string',
|
||||
'kordinat_lat' => 'nullable|string',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get common rules that apply to all actions.
|
||||
*/
|
||||
private function getCommonRules(): array
|
||||
{
|
||||
return [
|
||||
'fakta_positif' => 'nullable|array',
|
||||
'fakta_negatif' => 'nullable|array',
|
||||
'rute_menuju' => 'nullable',
|
||||
'batas_batas' => 'required|array',
|
||||
'batas_batas_input' => 'nullable|array',
|
||||
'kondisi_lingkungan' => 'nullable|array',
|
||||
'kondisi_lain_bangunan' => 'nullable|array',
|
||||
'informasi_dokument' => 'nullable|array',
|
||||
'peruntukan' => 'nullable',
|
||||
'kdb' => 'nullable',
|
||||
'kdh' => 'nullable',
|
||||
'gsb' => 'nullable',
|
||||
'max_lantai' => 'nullable',
|
||||
'klb' => 'nullable',
|
||||
'gss' => 'nullable',
|
||||
'pelebaran_jalan' => 'nullable',
|
||||
'nama_petugas' => 'nullable',
|
||||
'lat' => 'nullable|numeric',
|
||||
'lng' => 'nullable|numeric',
|
||||
'foto_gistaru' => 'nullable',
|
||||
'foto_bhumi' => 'nullable',
|
||||
'foto_argis_region' => 'nullable',
|
||||
'foto_tempat' => 'nullable',
|
||||
'upload_gs' => 'nullable',
|
||||
'foto_sentuh_tanahku' => 'nullable',
|
||||
'keterangan' => 'nullable|array',
|
||||
];
|
||||
}
|
||||
|
||||
private function getRapRules()
|
||||
{
|
||||
return [
|
||||
|
||||
|
||||
'perizinan' => 'nullable|array',
|
||||
'perizinan.*' => 'nullable|string',
|
||||
'perizinan_file' => 'nullable|array',
|
||||
'perizinan_file.*' => 'nullable|file|mimes:pdf,docx',
|
||||
|
||||
'brosur_price_list' => 'nullable|array',
|
||||
'brosur_price_list.*' => 'nullable|string',
|
||||
'brosur_price_list_file' => 'nullable|array',
|
||||
'brosur_price_list_file.*' => 'nullable|file|mimes:pdf,docx',
|
||||
|
||||
'pengalaman_developer' => 'nullable',
|
||||
'developer_anggota' => 'nullable',
|
||||
'lainnya_developer.*' => 'nullable',
|
||||
'kapan_mulai_dibangun' => 'nullable',
|
||||
'kondisi_perumahan' => 'nullable',
|
||||
'progres_pembangunan' => 'nullable',
|
||||
'kontraktor' => 'nullable',
|
||||
'lingkungan_sekitar' => 'nullable',
|
||||
'komplek_disekitar' => 'nullable',
|
||||
'pusat_keramaian' => 'nullable',
|
||||
'transportasi_umum' => 'nullable',
|
||||
'lainnya_kondisi.*' => 'nullable',
|
||||
|
||||
// Validasi untuk partisi yang diperbarui
|
||||
'partisi' => 'nullable|array',
|
||||
'partisi.*' => 'nullable|array',
|
||||
'partisi.*.nama' => 'nullable|string',
|
||||
'partisi.*.value' => 'nullable|string|max:255',
|
||||
|
||||
'jumlah_unit.*' => 'nullable',
|
||||
'batas_batas_perumahan' => 'nullable',
|
||||
'fasus_fasum.*' => 'nullable',
|
||||
'progres_penjualan.*' => 'nullable',
|
||||
'harga_unit.*' => 'nullable',
|
||||
'target_market.*' => 'nullable',
|
||||
'kerjasama_dengan_bank' => 'nullable',
|
||||
'rute_menuju_lokasi' => 'nullable',
|
||||
'peruntukan' => 'nullable',
|
||||
'kdb' => 'nullable',
|
||||
'kdh' => 'nullable',
|
||||
'gsb' => 'nullable',
|
||||
'max_lantai' => 'nullable',
|
||||
'klb' => 'nullable',
|
||||
'gss' => 'nullable',
|
||||
'pelebaran_jalan' => 'nullable',
|
||||
'nama_petugas' => 'nullable',
|
||||
'lat' => 'nullable|numeric',
|
||||
'lng' => 'nullable|numeric',
|
||||
'foto_gistaru' => 'nullable',
|
||||
'foto_bhumi' => 'nullable',
|
||||
'foto_argis_region' => 'nullable',
|
||||
'foto_tempat' => 'nullable',
|
||||
'upload_gs' => 'nullable',
|
||||
'foto_sentuh_tanahku' => 'nullable',
|
||||
'keterangan' => 'nullable|array',
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
'name' => 'required|max:255',
|
||||
'slug' => 'required|max:255',
|
||||
'jenis_legalitas_jaminan_id' => 'nullable',
|
||||
'form_kategori' => 'required',
|
||||
];
|
||||
}
|
||||
|
||||
@@ -38,13 +39,14 @@
|
||||
$this->merge([
|
||||
'code' => IdGenerator::generate(
|
||||
['table' => 'jenis_jaminan', 'length' => 5, 'prefix' => 'JJ', 'field' => 'code'],
|
||||
)
|
||||
),
|
||||
]);
|
||||
}
|
||||
|
||||
$this->merge([
|
||||
'jenis_legalitas_jaminan_id' => json_encode($this->jenis_legalitas_jaminan_id),
|
||||
'slug' => Str::slug($this->name),
|
||||
'form_kategori' => json_encode($this->form_kategori),
|
||||
'slug' => Str::slug($this->name),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
54
app/Http/Requests/JenisLampiranRequest.php
Normal file
54
app/Http/Requests/JenisLampiranRequest.php
Normal file
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class JenisLampiranRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
$rules = [
|
||||
'nama' => [
|
||||
'required',
|
||||
'string',
|
||||
'max:255',
|
||||
Rule::unique('jenis_lampiran')->where(function ($query) {
|
||||
return $query->whereNull('deleted_at');
|
||||
})->ignore($this->route('jenis_lampiran')),
|
||||
],
|
||||
'deskripsi' => 'nullable|string',
|
||||
];
|
||||
|
||||
return $rules;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get custom messages for validator errors.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function messages()
|
||||
{
|
||||
return [
|
||||
'nama.required' => 'Nama jenis lampiran harus diisi.',
|
||||
'nama.max' => 'Nama jenis lampiran tidak boleh lebih dari 255 karakter.',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,8 @@
|
||||
'slug' => 'required|max:255',
|
||||
'custom_field' => 'nullable|max:255',
|
||||
'custom_field_type' => 'nullable|max:255',
|
||||
'custom_fields' => 'nullable|array',
|
||||
'custom_fields.*' => 'required|string|max:255',
|
||||
];
|
||||
}
|
||||
|
||||
@@ -46,5 +48,10 @@
|
||||
'slug' => Str::slug($this->name),
|
||||
]);
|
||||
}
|
||||
|
||||
// Ensure custom_fields is always an array
|
||||
if (!is_array($this->custom_fields)) {
|
||||
$this->merge(['custom_fields' => []]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,23 +24,34 @@ class KJPPRequest extends FormRequest
|
||||
'nomor_telepon_kantor' => 'nullable|numeric|digits_between:8,15',
|
||||
'email_kantor' => 'required|email',
|
||||
'detail_email_kantor' => 'nullable',
|
||||
'detail_email_kantor.email_kantor.*' => 'email',
|
||||
'nama_pimpinan' => 'required|string|not_regex:/^\d+$/|max:255',
|
||||
'detail_nama_pimpinan' => 'nullable',
|
||||
'detail_nama_pimpinan.nama_pimpinan.*' => 'string|not_regex:/^\d+$/|max:255',
|
||||
'nomor_hp_pimpinan' => 'required|numeric|digits_between:10,15',
|
||||
'detail_nomor_hp_pimpinan' => 'nullable',
|
||||
'detail_nomor_hp_pimpinan.nomor_hp_pimpinan.*' => 'numeric|digits_between:10,15',
|
||||
'nama_pic_reviewer' => 'nullable|string|not_regex:/^\d+$/|max:255',
|
||||
'detail_nama_pic_reviewer' => 'nullable',
|
||||
'detail_nama_pic_reviewer.nama_pic_reviewer.*' => 'string|not_regex:/^\d+$/|max:255',
|
||||
'nomor_hp_pic_reviewer' => 'nullable|numeric|digits_between:10,15',
|
||||
'detail_nomor_hp_pic_reviewer' => 'nullable',
|
||||
'detail_nomor_hp_pic_reviewer.nomor_hp_pic_reviewer.*' => 'numeric|digits_between:10,15',
|
||||
'nama_pic_admin' => 'nullable|string|not_regex:/^\d+$/|max:255',
|
||||
'detail_nama_pic_admin' => 'nullable',
|
||||
'detail_nama_pic_admin.nama_pic_admin.*' => 'string|not_regex:/^\d+$/|max:255',
|
||||
'nomor_hp_pic_admin' => 'nullable|numeric|digits_between:10,15',
|
||||
'detail_nomor_hp_pic_admin' => 'nullable',
|
||||
'detail_nomor_hp_pic_admin.nomor_hp_pic_admin.*' => 'numeric|digits_between:10,15',
|
||||
'nama_pic_marketing' => 'nullable|string|not_regex:/^\d+$/|max:255',
|
||||
'detail_nama_pic_marketing' => 'nullable',
|
||||
'detail_nama_pic_marketing.nama_pic_marketing.*' => 'string|not_regex:/^\d+$/|max:255',
|
||||
'nomor_hp_pic_marketing' => 'nullable|numeric|digits_between:10,15',
|
||||
'detail_nomor_hp_pic_marketing' => 'nullable',
|
||||
'detail_nomor_hp_pic_marketing.nomor_hp_pic_marketing.*' => 'numeric|digits_between:10,15',
|
||||
'ijin_usaha_id' => 'required|array',
|
||||
'ijin_usaha_id.*' => 'exists:ijin_usaha,code',
|
||||
'jenis_aset_id' => 'required|array',
|
||||
'jenis_aset_id' => 'nullable|array',
|
||||
'jenis_aset_id.*' => 'exists:jenis_jaminan,code',
|
||||
'attachment' => 'nullable|mimes:pdf|max:1024'
|
||||
];
|
||||
@@ -81,22 +92,34 @@ class KJPPRequest extends FormRequest
|
||||
'nomor_telepon_kantor.digits_between' => 'Nomor Telepon Kantor minimum 8 digit dan maksimum 15 digit!',
|
||||
'email_kantor.required' => 'Email Kantor Wajib diisi!',
|
||||
'email_kantor.email' => 'Email Kantor tidak valid!',
|
||||
'detail_email_kantor.email_kantor.*.email' => 'Email Kantor tidak valid!',
|
||||
'nama_pimpinan.required' => 'Nama Pimpinan Wajib diisi!',
|
||||
'nama_pimpinan.not_regex' => 'Nama Pimpinan harus berupa huruf!',
|
||||
'detail_nama_pimpinan.nama_pimpinan.*.not_regex' => 'Nama Pimpinan harus berupa huruf!',
|
||||
'nomor_hp_pimpinan.required' => 'Nomor HP Pimpinan Wajib diisi!',
|
||||
'nomor_hp_pimpinan.numeric' => 'Nomor HP Pimpinan harus berupa angka!',
|
||||
'nomor_hp_pimpinan.digits_between' => 'Nomor HP Pimpinan minimum 10 digit dan maksimum 15 digit!',
|
||||
'detail_nomor_hp_pimpinan.nomor_hp_pimpinan.*.numeric' => 'Nomor HP Pimpinan harus berupa angka!',
|
||||
'detail_nomor_hp_pimpinan.nomor_hp_pimpinan.*.digits_between' => 'Nomor HP Pimpinan minimum 10 digit dan maksimum 15 digit!',
|
||||
'nama_pic_reviewer.not_regex' => 'Nama PIC Reviewer harus berupa huruf!',
|
||||
'detail_nama_pic_reviewer.nama_pic_reviewer.*.not_regex' => 'Nama PIC Reviewer harus berupa huruf!',
|
||||
'nomor_hp_pic_reviewer.numeric' => 'Nomor HP PIC Reviewer harus berupa angka!',
|
||||
'nomor_hp_pic_reviewer.digits_between' => 'Nomor HP PIC Reviewer minimum 10 digit dan maksimum 15 digit!',
|
||||
'detail_nomor_hp_pic_reviewer.nomor_hp_pic_reviewer.*.numeric' => 'Nomor HP PIC Reviewer harus berupa angka!',
|
||||
'detail_nomor_hp_pic_reviewer.nomor_hp_pic_reviewer.*.digits_between' => 'Nomor HP PIC Reviewer minimum 10 digit dan maksimum 15 digit!',
|
||||
'nama_pic_admin.not_regex' => 'Nama PIC Admin harus berupa huruf!',
|
||||
'detail_nama_pic_admin.nama_pic_admin.*.not_regex' => 'Nama PIC Admin harus berupa huruf!',
|
||||
'nomor_hp_pic_admin.numeric' => 'Nomor HP PIC Admin harus berupa angka!',
|
||||
'nomor_hp_pic_admin.digits_between' => 'Nomor HP PIC Admin minimum 10 digit dan maksimum 15 digit!',
|
||||
'detail_nomor_hp_pic_admin.nomor_hp_pic_admin.*.numeric' => 'Nomor HP PIC Admin harus berupa angka!',
|
||||
'detail_nomor_hp_pic_admin.nomor_hp_pic_admin.*.digits_between' => 'Nomor HP PIC Admin minimum 10 digit dan maksimum 15 digit!',
|
||||
'nama_pic_marketing.not_regex' => 'Nama PIC Marketing harus berupa huruf!',
|
||||
'detail_nama_pic_marketing.nama_pic_marketing.*.not_regex' => 'Nama PIC Marketing harus berupa huruf!',
|
||||
'nomor_hp_pic_marketing.numeric' => 'Nomor HP PIC Marketing harus berupa angka!',
|
||||
'nomor_hp_pic_marketing.digits_between' => 'Nomor HP PIC Marketing minimum 10 digit dan maksimum 15 digit!',
|
||||
'detail_nomor_hp_pic_marketing.nomor_hp_pic_marketing.*.numeric' => 'Nomor HP PIC Marketing harus berupa angka!',
|
||||
'detail_nomor_hp_pic_marketing.nomor_hp_pic_marketing.*.digits_between' => 'Nomor HP PIC Marketing minimum 10 digit dan maksimum 15 digit!',
|
||||
'ijin_usaha_id.required' => 'Ijin Usaha Wajib diisi!',
|
||||
'jenis_aset_id.required' => 'Jenis Aset Wajib diisi!',
|
||||
'attachment.mimes' => 'Attachment harus berformat pdf!',
|
||||
'attachment.max' => 'Attachment berukuran maksimum 1 MB!',
|
||||
];
|
||||
|
||||
41
app/Http/Requests/LaporanExternalRequest.php
Normal file
41
app/Http/Requests/LaporanExternalRequest.php
Normal file
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class LaporanExternalRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*/
|
||||
public function rules()
|
||||
: array
|
||||
{
|
||||
return [
|
||||
'permohonan_id' => 'required|exists:permohonan,id',
|
||||
'nomor_laporan' => 'nullable|string|max:255',
|
||||
'tgl_final_laporan' => 'nullable|date',
|
||||
'nilai_pasar' => 'nullable|numeric',
|
||||
'indikasi_nilai_likuidasi' => 'nullable|numeric',
|
||||
'indikasi_nilai_pasar_tanah' => 'nullable|numeric',
|
||||
'estimasi_harga_tanah' => 'nullable|numeric',
|
||||
'estimasi_harga_bangunan' => 'nullable|numeric',
|
||||
'indikasi_nilai_pasar_bangunan' => 'nullable|numeric',
|
||||
'indikasi_nilai_pasar_sarana_pelengkap' => 'nullable|numeric',
|
||||
'indikasi_nilai_pasar_mesin' => 'nullable|numeric',
|
||||
'indikasi_nilai_pasar_kendaraan_alat_berat' => 'nullable|numeric',
|
||||
'file_resume' => 'nullable|file|mimes:pdf|max:10240', // 10MB max
|
||||
'file_laporan' => 'nullable|file|mimes:pdf|max:10240',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize()
|
||||
: bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,7 @@
|
||||
{
|
||||
$rules = [
|
||||
'name' => 'required|max:255',
|
||||
'biaya' => 'nullable|numeric|min:0',
|
||||
];
|
||||
|
||||
if ($this->method() == 'PUT') {
|
||||
|
||||
167
app/Http/Requests/NocRequest.php
Normal file
167
app/Http/Requests/NocRequest.php
Normal file
@@ -0,0 +1,167 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
/**
|
||||
* Form Request untuk validasi data NOC (Notice of Completion)
|
||||
*/
|
||||
class NocRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Konstanta untuk jenis file yang diizinkan
|
||||
*/
|
||||
private const ALLOWED_FILE_TYPES = 'pdf,jpg,jpeg,png';
|
||||
|
||||
/**
|
||||
* Konstanta untuk ukuran file maksimum (dalam KB)
|
||||
*/
|
||||
private const MAX_FILE_SIZE = 10240;
|
||||
|
||||
/**
|
||||
* Menentukan apakah pengguna berwenang untuk melakukan request ini
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mengumpulkan semua aturan validasi
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return array_merge(
|
||||
$this->getBasicInfoRules(),
|
||||
$this->getPaymentRules(),
|
||||
$this->getSettlementRules(),
|
||||
$this->getAuthorizationRules(),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Aturan validasi untuk informasi dasar
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function getBasicInfoRules()
|
||||
{
|
||||
return [
|
||||
'permohonan_id' => 'nullable|exists:permohonan,id',
|
||||
'persetujuan_penawaran_id' => 'required|exists:persetujuan_penawaran,id',
|
||||
'status' => 'nullable|boolean',
|
||||
'created_by' => 'nullable|exists:users,id',
|
||||
'updated_by' => 'nullable|exists:users,id',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Aturan validasi untuk data pembayaran
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function getPaymentRules()
|
||||
{
|
||||
$fileRule = 'nullable|file|mimes:' . self::ALLOWED_FILE_TYPES . '|max:' . self::MAX_FILE_SIZE;
|
||||
|
||||
return [
|
||||
'total_harus_bayar' => 'nullable|numeric|min:0',
|
||||
'nominal_bayar' => 'nullable|numeric|min:0',
|
||||
'total_pembukuan' => 'nullable|numeric|min:0',
|
||||
'bukti_ksl' => $fileRule,
|
||||
'bukti_bayar' => $fileRule,
|
||||
'status_bayar' => 'nullable|boolean',
|
||||
'tanggal_pembayaran' => 'nullable|date',
|
||||
'status_kurang_bayar' => 'nullable|boolean',
|
||||
'status_lebih_bayar' => 'nullable|boolean',
|
||||
'nominal_kurang_bayar' => 'nullable|numeric|min:0',
|
||||
'nominal_lebih_bayar' => 'nullable|numeric|min:0',
|
||||
'bukti_pengembalian' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:2048',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Aturan validasi untuk data penyelesaian
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function getSettlementRules()
|
||||
{
|
||||
$fileRule = 'nullable|file|mimes:' . self::ALLOWED_FILE_TYPES . '|max:' . self::MAX_FILE_SIZE;
|
||||
|
||||
return [
|
||||
'nominal_penyelesaian' => 'nullable|numeric|min:0',
|
||||
'status_penyelesaian' => 'nullable|boolean',
|
||||
'tanggal_penyelesaian' => 'nullable|date',
|
||||
'bukti_penyelesaian' => $fileRule,
|
||||
'memo_penyelesaian' => $fileRule,
|
||||
'catatan_noc' => 'nullable|string',
|
||||
'nomor_tiket' => 'nullable|string',
|
||||
'nomor_rekening_lebih_bayar' => 'nullable|string',
|
||||
'bukti_ksl_lebih_bayar' => 'nullable|string',
|
||||
'bukti_ksl_kurang_bayar' => 'nullable|string'
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Aturan validasi untuk otorisasi
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function getAuthorizationRules()
|
||||
{
|
||||
return [
|
||||
'authorized_status' => 'nullable|boolean',
|
||||
'authorized_at' => 'nullable|date',
|
||||
'authorized_by' => 'nullable|exists:users,id',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Pesan khusus untuk validasi
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function messages()
|
||||
{
|
||||
return [
|
||||
'permohonan_id.exists' => 'ID Permohonan tidak valid',
|
||||
'persetujuan_penawaran_id.required' => 'ID Persetujuan Penawaran harus diisi',
|
||||
'persetujuan_penawaran_id.exists' => 'ID Persetujuan Penawaran tidak valid',
|
||||
'nominal_bayar.numeric' => 'Nominal Bayar harus berupa angka',
|
||||
'nominal_bayar.min' => 'Nominal Bayar minimal 0',
|
||||
'bukti_ksl.file' => 'Bukti KSL harus berupa file',
|
||||
'bukti_ksl.mimes' => 'Bukti KSL harus berformat pdf, jpg, jpeg, atau png',
|
||||
'bukti_ksl.max' => 'Ukuran Bukti KSL maksimal 10MB',
|
||||
'bukti_bayar.file' => 'Bukti Bayar harus berupa file',
|
||||
'bukti_bayar.mimes' => 'Bukti Bayar harus berformat pdf, jpg, jpeg, atau png',
|
||||
'bukti_bayar.max' => 'Ukuran Bukti Bayar maksimal 10MB',
|
||||
'status.boolean' => 'Status harus berupa boolean',
|
||||
'status_bayar.boolean' => 'Status Bayar harus berupa boolean',
|
||||
'tanggal_pembayaran.date' => 'Format Tanggal Pembayaran tidak valid',
|
||||
'nominal_penyelesaian.numeric' => 'Nominal Penyelesaian harus berupa angka',
|
||||
'nominal_penyelesaian.min' => 'Nominal Penyelesaian minimal 0',
|
||||
'status_penyelesaian.boolean' => 'Status Penyelesaian harus berupa boolean',
|
||||
'tanggal_penyelesaian.date' => 'Format Tanggal Penyelesaian tidak valid',
|
||||
'bukti_penyelesaian.file' => 'Bukti Penyelesaian harus berupa file',
|
||||
'bukti_penyelesaian.mimes' => 'Bukti Penyelesaian harus berformat pdf, jpg, jpeg, atau png',
|
||||
'bukti_penyelesaian.max' => 'Ukuran Bukti Penyelesaian maksimal 10MB',
|
||||
'memo_penyelesaian.file' => 'Memo Penyelesaian harus berupa file',
|
||||
'memo_penyelesaian.mimes' => 'Memo Penyelesaian harus berformat pdf, jpg, jpeg, atau png',
|
||||
'memo_penyelesaian.max' => 'Ukuran Memo Penyelesaian maksimal 10MB',
|
||||
'authorized_status.boolean' => 'Status Otorisasi harus berupa boolean',
|
||||
'authorized_at.date' => 'Format Tanggal Otorisasi tidak valid',
|
||||
'authorized_by.exists' => 'User Otorisasi tidak valid',
|
||||
'status_kurang_bayar.boolean' => 'Status Kurang Bayar harus berupa boolean',
|
||||
'status_lebih_bayar.boolean' => 'Status Lebih Bayar harus berupa boolean',
|
||||
'nominal_kurang_bayar.numeric' => 'Nominal Kurang Bayar harus berupa angka',
|
||||
'nominal_kurang_bayar.min' => 'Nominal Kurang Bayar minimal 0',
|
||||
'nominal_lebih_bayar.numeric' => 'Nominal Lebih Bayar harus berupa angka',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -25,21 +25,18 @@ class PenilaianRequest extends FormRequest
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
|
||||
return [
|
||||
'jenis_penilaian_id' => 'required|max:255',
|
||||
'teams_id' => 'required|max:255',
|
||||
'tanggal_kunjungan' => 'required|max:255',
|
||||
'status' => 'required|string',
|
||||
'nomor_registrasi' => 'required|string',
|
||||
|
||||
'surveyor_id' => 'nullable|required_without_all:penilai_surveyor_id,surveyor_region_id,penilai_region_id,penilai_id',
|
||||
'penilai_id' => 'nullable|required_without_all:penilai_surveyor_id,surveyor_region_id,penilai_region_id,surveyor_id',
|
||||
'penilai_surveyor_id' => 'nullable',
|
||||
'surveyor_region_id' => 'nullable|required_without_all:penilai_surveyor_id,penilai_region_id,penilai_id,surveyor_id',
|
||||
'penilai_region_id' => 'nullable|required_without_all:penilai_surveyor_id,surveyor_region_id,penilai_id,surveyor_id',
|
||||
|
||||
'surveyor_penilai_region_id' => 'nullable',
|
||||
'keterangan' => 'nullable',
|
||||
];
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
'status' => 'nullable|string',
|
||||
'jenis_fasilitas_kredit_id' => 'required|exists:jenis_fasilitas_kredit,id',
|
||||
'nilai_plafond_id' => 'required|exists:nilai_plafond,id',
|
||||
'status_bayar' => 'required|string',
|
||||
'status_bayar' => 'nullable|string',
|
||||
'nilai_njop' => 'nullable|numeric'
|
||||
];
|
||||
|
||||
@@ -48,7 +48,6 @@
|
||||
),
|
||||
'tanggal_permohonan' => date('Y-m-d'),
|
||||
'user_id' => auth()->user()->id,
|
||||
'branch_id' => auth()->user()->branch_id,
|
||||
'status' => 'order'
|
||||
]);
|
||||
}
|
||||
|
||||
67
app/Http/Requests/PersetujuanPenawaranRequest.php
Normal file
67
app/Http/Requests/PersetujuanPenawaranRequest.php
Normal file
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class PersetujuanPenawaranRequest extends FormRequest
|
||||
{
|
||||
public function authorize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'permohonan_id' => 'nullable|exists:permohonan,id',
|
||||
'penawaran_id' => 'nullable|exists:penawaran,id',
|
||||
'nomor_proposal_penawaran' => 'nullable|string|max:255',
|
||||
'nomor_tiket' => 'nullable|string|max:100',
|
||||
'nominal_kurang_bayar' => 'nullable|string|max:100',
|
||||
'bukti_ksl_kurang_bayar' => 'nullable|file|mimes:pdf,doc,docx|max:10240',
|
||||
'tanggal_proposal_penawaran' => 'nullable|date',
|
||||
'biaya_final' => 'nullable|numeric|min:0',
|
||||
'sla_resume' => 'nullable|numeric|min:0',
|
||||
'sla_final' => 'nullable|numeric|min:0',
|
||||
'file_persetujuan_penawaran' => 'nullable|file|mimes:pdf,doc,docx|max:10240',
|
||||
'surat_representasi' => 'nullable|file|mimes:pdf,doc,docx|max:10240',
|
||||
'status' => 'nullable|boolean',
|
||||
'authorized_status' => 'boolean',
|
||||
'authorized_at' => 'nullable|date',
|
||||
'authorized_by' => 'nullable|exists:users,id',
|
||||
'catatan' => 'nullable|string',
|
||||
];
|
||||
}
|
||||
|
||||
public function messages()
|
||||
{
|
||||
return [
|
||||
'penawaran_id.required' => 'Penawaran ID wajib diisi.',
|
||||
'penawaran_id.exists' => 'Penawaran ID tidak valid.',
|
||||
'nomor_proposal_penawaran.required' => 'Nomor proposal penawaran wajib diisi.',
|
||||
'nomor_tiket.string' => 'Nomor tiket harus berupa teks.',
|
||||
'nomor_tiket.max' => 'Nomor tiket tidak boleh lebih dari 100 karakter.',
|
||||
'tanggal_proposal_penawaran.required' => 'Tanggal proposal penawaran wajib diisi.',
|
||||
'tanggal_proposal_penawaran.date' => 'Tanggal proposal penawaran harus berupa tanggal yang valid.',
|
||||
'biaya_final.required' => 'Biaya final wajib diisi.',
|
||||
'biaya_final.numeric' => 'Biaya final harus berupa angka.',
|
||||
'biaya_final.min' => 'Biaya final tidak boleh kurang dari 0.',
|
||||
'sla_resume.required' => 'SLA Resume wajib diisi.',
|
||||
'sla_final.required' => 'SLA Final wajib diisi.',
|
||||
'file_persetujuan_penawaran.file' => 'File Persetujuan Penawaran harus berupa file.',
|
||||
'file_persetujuan_penawaran.mimes' => 'File Persetujuan Penawaran harus berupa file PDF, DOC, atau DOCX.',
|
||||
'file_persetujuan_penawaran.max' => 'Ukuran File Persetujuan Penawaran tidak boleh lebih dari 10MB.',
|
||||
'surat_representasi.file' => 'Surat Representasi harus berupa file.',
|
||||
'surat_representasi.mimes' => 'Surat Representasi harus berupa file PDF, DOC, atau DOCX.',
|
||||
'surat_representasi.max' => 'Ukuran Surat Representasi tidak boleh lebih dari 10MB.',
|
||||
'region_id.required' => 'Region ID wajib diisi.',
|
||||
'region_id.exists' => 'Region ID tidak valid.',
|
||||
'status.required' => 'Status wajib diisi.',
|
||||
'status.boolean' => 'Status harus berupa nilai boolean.',
|
||||
'authorized_status.boolean' => 'Status otorisasi harus berupa nilai boolean.',
|
||||
'authorized_at.date' => 'Tanggal otorisasi harus berupa tanggal yang valid.',
|
||||
'authorized_by.exists' => 'ID pengguna yang mengotorisasi tidak valid.',
|
||||
];
|
||||
}
|
||||
}
|
||||
85
app/Http/Requests/ProsesPenawaranRequest.php
Normal file
85
app/Http/Requests/ProsesPenawaranRequest.php
Normal file
@@ -0,0 +1,85 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class ProsesPenawaranRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
$rules = [
|
||||
'kjpp.*' => 'exists:kjpp,id',
|
||||
'tujuan_penilaian_kjpp_id' => 'required',
|
||||
'jenis_laporan_id' => 'required',
|
||||
'start_date' => 'required',
|
||||
'end_date' => 'required',
|
||||
'catatan' => 'nullable'
|
||||
];
|
||||
|
||||
// if ($this->method() == 'PUT') {
|
||||
// $rules['code'] = 'required|max:50';
|
||||
// } else {
|
||||
// $rules['code'] = 'required|max:50|unique:penawaran,code';
|
||||
// }
|
||||
|
||||
return $rules;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function messages(): array
|
||||
{
|
||||
return [
|
||||
'code.required' => 'Kode Penawaran Wajib diisi!',
|
||||
'code.max' => 'Kode Penawaran maksimal 255 huruf!',
|
||||
'code.unique' => 'Kode Penawaran tidak boleh sama!',
|
||||
'tujuan_penilaian_kjpp_id.required' => 'Tujuan Penilaian KJPP Wajib diisi!',
|
||||
'jenis_laporan_id.required' => 'Jenis Laporan Wajib diisi!',
|
||||
'start_date.required' => 'Tanggal Awal Wajib diisi!',
|
||||
'end_date.required' => 'Tanggal Akhir Wajib diisi!',
|
||||
];
|
||||
}
|
||||
|
||||
public function withValidator($validator)
|
||||
{
|
||||
$validator->after(function ($validator) {
|
||||
$startDate = strtotime($this->input('start_date'));
|
||||
$endDate = strtotime($this->input('end_date'));
|
||||
$today = strtotime(date('Y-m-d'));
|
||||
|
||||
// Jika dalam keadaan tambah penawaran maka munculkan pesan ini
|
||||
// if ($this->method() !== 'PUT') {
|
||||
// if ($startDate < $today) {
|
||||
// $validator->errors()->add('start_date', 'Tanggal Awal tidak boleh sebelum hari ini.');
|
||||
// }
|
||||
// }
|
||||
|
||||
if ($endDate < $startDate) {
|
||||
$validator->errors()->add('end_date', 'Tanggal Akhir tidak boleh lebih awal dari Tanggal Awal.');
|
||||
}
|
||||
|
||||
|
||||
// Validasi minimal 3 pilihan pada nama_kjpp
|
||||
$namaKjpp = $this->input('kjpp', []);
|
||||
|
||||
// jika nama KJPP itu kosong
|
||||
if (empty($namaKjpp)) {
|
||||
$validator->errors()->add('kjpp', 'Nama KJPP wajib diisi.');
|
||||
}
|
||||
// jika terisi kurang dari 3 item
|
||||
elseif (is_array($namaKjpp) && count($namaKjpp) < 3) {
|
||||
$validator->errors()->add('kjpp', 'Nama KJPP minimal 3 pilihan.');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,8 @@ class RegionRequest extends FormRequest
|
||||
$rules = [
|
||||
'name' => 'required|string|max:255',
|
||||
'status' => 'nullable|boolean',
|
||||
'url' => 'nullable|string|max:255',
|
||||
'name_url' => 'nullable|string|max:255',
|
||||
'authorized_at' => 'nullable|datetime',
|
||||
'authorized_status' => 'nullable|string|max:1',
|
||||
'authorized_by' => 'nullable|exists:users,id',
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
namespace Modules\Lpj\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class SurveyorRequest extends FormRequest
|
||||
@@ -28,6 +27,19 @@ class SurveyorRequest extends FormRequest
|
||||
'spek-bangunan' => 'spek_bangunan',
|
||||
'lantai-unit' => 'lantai',
|
||||
'view-unit' => 'view_unit',
|
||||
'jenis-pesawat' => 'jenis_pesawat',
|
||||
'model-alat-berat' => 'model_alat_berat',
|
||||
'jenis-kapal' => 'jenis_kapal',
|
||||
'jenis-kendaraan' => 'jenis_kendaraan',
|
||||
'jenis-unit' => 'jenis_unit',
|
||||
'terletak-area' => 'terletak_area',
|
||||
'merupakan-daerah' => 'merupakan_daerah',
|
||||
'posisi-unit' => 'posisi_unit',
|
||||
'bentuk-unit' => 'bentuk_unit',
|
||||
'fasilitas-objek' => 'fasilitas_objek',
|
||||
'perkerasan-jalan' => 'perkerasan_jalan',
|
||||
'foto-objek-jaminan' => 'foto_objek_jaminan',
|
||||
'perizinan' => 'perizinan'
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -74,6 +86,9 @@ class SurveyorRequest extends FormRequest
|
||||
|
||||
],
|
||||
],
|
||||
'foto-objek-jaminan' => [
|
||||
'kategori' => 'required',
|
||||
],
|
||||
// Add more action specific rules here
|
||||
default => [],
|
||||
};
|
||||
|
||||
@@ -13,7 +13,7 @@ class TenderPenawaranRequest extends FormRequest
|
||||
{
|
||||
$rules = [
|
||||
'nama_kjpp_sebelumnya' => 'nullable',
|
||||
'biaya_kjpp_sebelumnya' => 'nullable|numeric',
|
||||
'biaya_kjpp_sebelumnya' => 'nullable',
|
||||
'tanggal_penilaian_sebelumnya' => 'nullable',
|
||||
'nomor_registrasi' => 'required',
|
||||
'kjpp.*' => 'exists:kjpp,id',
|
||||
|
||||
341
app/Imports/BucokImport.php
Normal file
341
app/Imports/BucokImport.php
Normal file
@@ -0,0 +1,341 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Imports;
|
||||
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Maatwebsite\Excel\Concerns\ToCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithStartRow;
|
||||
use Maatwebsite\Excel\Concerns\WithValidation;
|
||||
use Maatwebsite\Excel\Concerns\WithBatchInserts;
|
||||
use Maatwebsite\Excel\Concerns\WithChunkReading;
|
||||
use Modules\Lpj\Models\Bucok;
|
||||
use Carbon\Carbon;
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* Kelas untuk mengimpor data Excel ke tabel bucoks
|
||||
* Menggunakan Laravel Excel dengan validasi dan batch processing
|
||||
* Data dimulai dari baris ke-5 tanpa header
|
||||
*/
|
||||
class BucokImport implements ToCollection, WithStartRow, WithValidation, WithBatchInserts, WithChunkReading
|
||||
{
|
||||
private $importedCount = 0;
|
||||
private $skippedCount = 0;
|
||||
private $createdCount = 0;
|
||||
private $updatedCount = 0;
|
||||
private $errors = [];
|
||||
|
||||
/**
|
||||
* Menentukan baris mulai membaca data (baris ke-5)
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function startRow(): int
|
||||
{
|
||||
return 5;
|
||||
}
|
||||
|
||||
/**
|
||||
* Memproses koleksi data dari Excel
|
||||
*
|
||||
* @param Collection $collection
|
||||
* @return void
|
||||
*/
|
||||
public function collection(Collection $collection)
|
||||
{
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
foreach ($collection as $rowIndex => $row) {
|
||||
// Log setiap baris yang diproses
|
||||
Log::info('Processing Bucok import row', [
|
||||
'row_number' => $rowIndex + 5, // +5 karena mulai dari baris 5
|
||||
'row_data' => $row->toArray()
|
||||
]);
|
||||
|
||||
// Konversi row ke array dengan indeks numerik
|
||||
$rowArray = $row->toArray();
|
||||
|
||||
// Skip baris kosong
|
||||
if (empty(array_filter($rowArray))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Validasi data baris
|
||||
$mappedData = $this->mapRowToBucok($rowArray, $rowIndex + 5);
|
||||
|
||||
// Update atau create berdasarkan nomor_tiket
|
||||
if (!empty($mappedData['nomor_tiket'])) {
|
||||
// Update atau create berdasarkan nomor_tiket
|
||||
$bucok = Bucok::updateOrCreate(
|
||||
['nomor_tiket' => $mappedData['nomor_tiket']], // Kondisi pencarian
|
||||
array_merge($mappedData, ['updated_by' => auth()->id()]) // Data yang akan diupdate/create
|
||||
);
|
||||
|
||||
// Log dan tracking apakah data di-update atau di-create
|
||||
if ($bucok->wasRecentlyCreated) {
|
||||
$this->createdCount++;
|
||||
Log::info('Bucok created successfully', [
|
||||
'row_number' => $rowIndex + 5,
|
||||
'nomor_tiket' => $mappedData['nomor_tiket'],
|
||||
'action' => 'created'
|
||||
]);
|
||||
} else {
|
||||
$this->updatedCount++;
|
||||
Log::info('Bucok updated successfully', [
|
||||
'row_number' => $rowIndex + 5,
|
||||
'nomor_tiket' => $mappedData['nomor_tiket'],
|
||||
'action' => 'updated'
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
$this->importedCount++;
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
|
||||
// Log summary
|
||||
Log::info('Bucok import completed', [
|
||||
'imported' => $this->importedCount,
|
||||
'skipped' => $this->skippedCount,
|
||||
'total_errors' => count($this->errors)
|
||||
]);
|
||||
|
||||
} catch (Exception $e) {
|
||||
DB::rollback();
|
||||
Log::error('Bucok import failed', ['error' => $e->getMessage()]);
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mapping data Excel berdasarkan indeks kolom ke struktur model Bucok
|
||||
* Kolom dimulai dari indeks 0 (A=0, B=1, C=2, dst.)
|
||||
*
|
||||
* @param array $row
|
||||
* @param int $rowNumber
|
||||
* @return array
|
||||
*/
|
||||
private function mapRowToBucok(array $row, int $rowNumber): array
|
||||
{
|
||||
return [
|
||||
'no' => $row[0] ?? null, // Kolom A
|
||||
'tanggal' => !empty($row[1]) ? $this->parseDate($row[1]) : null, // Kolom B
|
||||
'bulan' => $row[2] ?? null, // Kolom C
|
||||
'tahun' => $row[3] ?? null, // Kolom D
|
||||
'tanggal_penuh' => !empty($row[4]) ? $this->parseDate($row[4]) : null, // Kolom E
|
||||
'nomor_categ' => $row[5] ?? null, // Kolom F
|
||||
'coa_summary' => $row[6] ?? null, // Kolom G
|
||||
'nomor_coa' => $row[7] ?? null, // Kolom H
|
||||
'nama_coa' => $row[8] ?? null, // Kolom I
|
||||
'nomor_tiket' => $row[9] ?? null, // Kolom J - Auto-generate jika kosong
|
||||
'deskripsi' => $row[10] ?? null, // Kolom K
|
||||
'nominal' => $this->parseNumeric($row[11] ?? 0), // Kolom L
|
||||
'penyelesaian' => $row[12] ?? 'Belum Selesai', // Kolom M
|
||||
'umur_aging' => $this->parseNumeric($row[13] ?? 0), // Kolom N
|
||||
'cost_center' => $row[14] ?? null, // Kolom O
|
||||
'nama_sub_direktorat' => $row[15] ?? null, // Kolom P
|
||||
'nama_direktorat_cabang' => $row[16] ?? null, // Kolom Q
|
||||
'tanggal_penyelesaian' => !empty($row[17]) ? $this->parseDate($row[17]) : null, // Kolom R
|
||||
'nominal_penyelesaian' => $this->parseNumeric($row[18] ?? 0), // Kolom S
|
||||
'nominal_berjalan' => $this->parseNumeric($row[19] ?? 0), // Kolom T
|
||||
'amortisasi_berjalan' => $this->parseNumeric($row[20] ?? 0), // Kolom U
|
||||
'sistem_berjalan' => $this->parseNumeric($row[21] ?? 0), // Kolom V
|
||||
'lainnya_berjalan' => $this->parseNumeric($row[22] ?? 0), // Kolom W
|
||||
'nominal_gantung' => $this->parseNumeric($row[23] ?? 0), // Kolom X
|
||||
'aset_gantung' => $this->parseNumeric($row[24] ?? 0), // Kolom Y
|
||||
'keterangan_gantung' => $row[25] ?? null, // Kolom Z
|
||||
'lainnya_satu' => $row[26] ?? null, // Kolom AA
|
||||
'lainnya_dua' => $row[27] ?? null, // Kolom AB
|
||||
'created_by' => auth()->id(),
|
||||
'updated_by' => auth()->id()
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse tanggal dari berbagai format
|
||||
*
|
||||
* @param mixed $dateValue
|
||||
* @return Carbon|null
|
||||
*/
|
||||
private function parseDate($dateValue)
|
||||
{
|
||||
if (empty($dateValue)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
// Jika berupa angka Excel date serial
|
||||
if (is_numeric($dateValue)) {
|
||||
return Carbon::createFromFormat('Y-m-d', \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($dateValue)->format('Y-m-d'));
|
||||
}
|
||||
|
||||
// Jika berupa string tanggal
|
||||
return Carbon::parse($dateValue);
|
||||
} catch (Exception $e) {
|
||||
Log::warning('Failed to parse date', ['value' => $dateValue, 'error' => $e->getMessage()]);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse nilai numerik dari berbagai format
|
||||
*
|
||||
* @param mixed $numericValue
|
||||
* @return float
|
||||
*/
|
||||
private function parseNumeric($numericValue): float
|
||||
{
|
||||
if (empty($numericValue)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Hapus karakter non-numerik kecuali titik dan koma
|
||||
$cleaned = preg_replace('/[^0-9.,\-]/', '', $numericValue);
|
||||
|
||||
// Ganti koma dengan titik untuk decimal
|
||||
$cleaned = str_replace(',', '.', $cleaned);
|
||||
|
||||
return (float) $cleaned;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validasi data yang sudah dimapping
|
||||
*
|
||||
* @param array $data
|
||||
* @return \Illuminate\Validation\Validator
|
||||
*/
|
||||
private function validateMappedData(array $data)
|
||||
{
|
||||
return Validator::make($data, [
|
||||
'no' => 'nullable|integer',
|
||||
'tanggal' => 'nullable|date',
|
||||
'bulan' => 'nullable|integer|between:1,12',
|
||||
'tahun' => 'nullable|integer|min:2000|max:2099',
|
||||
'tanggal_penuh' => 'nullable|date',
|
||||
'nomor_categ' => 'nullable|string|max:50',
|
||||
'coa_summary' => 'nullable|string|max:255',
|
||||
'nomor_coa' => 'nullable|string|max:50',
|
||||
'nama_coa' => 'nullable|string|max:255',
|
||||
'nomor_tiket' => 'nullable|string|max:50',
|
||||
'deskripsi' => 'nullable|string',
|
||||
'nominal' => 'nullable|numeric|min:0',
|
||||
'penyelesaian' => 'nullable|in:Selesai,Belum Selesai,Dalam Proses',
|
||||
'umur_aging' => 'nullable|integer|min:0',
|
||||
'cost_center' => 'nullable|string|max:100',
|
||||
'nama_sub_direktorat' => 'nullable|string|max:255',
|
||||
'nama_direktorat_cabang' => 'nullable|string|max:255',
|
||||
'tanggal_penyelesaian' => 'nullable|date',
|
||||
'nominal_penyelesaian' => 'nullable|numeric|min:0',
|
||||
'nominal_berjalan' => 'nullable|numeric|min:0',
|
||||
'amortisasi_berjalan' => 'nullable|numeric|min:0',
|
||||
'sistem_berjalan' => 'nullable|numeric|min:0',
|
||||
'lainnya_berjalan' => 'nullable|numeric|min:0',
|
||||
'nominal_gantung' => 'nullable|numeric|min:0',
|
||||
'aset_gantung' => 'nullable|numeric|min:0',
|
||||
'keterangan_gantung' => 'nullable|string',
|
||||
'lainnya_satu' => 'nullable|string',
|
||||
'lainnya_dua' => 'nullable|string'
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Aturan validasi untuk seluruh file Excel (tidak digunakan karena tanpa header)
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Ukuran batch untuk insert
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function batchSize(): int
|
||||
{
|
||||
return 100;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ukuran chunk untuk membaca file
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function chunkSize(): int
|
||||
{
|
||||
return 100;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mendapatkan jumlah data yang berhasil diimpor
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getImportedCount(): int
|
||||
{
|
||||
return $this->importedCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mendapatkan jumlah data yang berhasil dibuat
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getCreatedCount(): int
|
||||
{
|
||||
return $this->createdCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mendapatkan jumlah data yang berhasil diupdate
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getUpdatedCount(): int
|
||||
{
|
||||
return $this->updatedCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mendapatkan statistik lengkap import
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getImportStatistics(): array
|
||||
{
|
||||
return [
|
||||
'total_processed' => $this->importedCount,
|
||||
'created' => $this->createdCount,
|
||||
'updated' => $this->updatedCount,
|
||||
'skipped' => $this->skippedCount,
|
||||
'errors' => count($this->errors)
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Mendapatkan jumlah data yang dilewati
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getSkippedCount(): int
|
||||
{
|
||||
return $this->skippedCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mendapatkan daftar error yang terjadi
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getErrors(): array
|
||||
{
|
||||
return $this->errors;
|
||||
}
|
||||
}
|
||||
415
app/Imports/SlikImport.php
Normal file
415
app/Imports/SlikImport.php
Normal file
@@ -0,0 +1,415 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Imports;
|
||||
|
||||
use Modules\Lpj\Models\Slik;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Maatwebsite\Excel\Concerns\ToCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithStartRow;
|
||||
use Maatwebsite\Excel\Concerns\WithChunkReading;
|
||||
use Maatwebsite\Excel\Concerns\WithBatchInserts;
|
||||
use Maatwebsite\Excel\Concerns\WithCustomCsvSettings;
|
||||
|
||||
|
||||
/**
|
||||
* Class SlikImport
|
||||
*
|
||||
* Handle import data Excel untuk modul Slik
|
||||
* Menggunakan Laravel Excel package untuk membaca file Excel
|
||||
* dengan optimasi memory dan chunk processing
|
||||
*
|
||||
* @package Modules\Lpj\app\Imports
|
||||
*/
|
||||
class SlikImport implements ToCollection, WithStartRow, WithBatchInserts, WithChunkReading, WithCustomCsvSettings
|
||||
{
|
||||
/**
|
||||
* Mulai membaca dari baris ke-5 (skip header)
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function startRow(): int
|
||||
{
|
||||
return 5;
|
||||
}
|
||||
|
||||
/**
|
||||
* Batch size untuk insert data dari konfigurasi
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function batchSize(): int
|
||||
{
|
||||
return config('import.slik.batch_size', 50);
|
||||
}
|
||||
|
||||
/**
|
||||
* Chunk size untuk membaca file dari konfigurasi
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function chunkSize(): int
|
||||
{
|
||||
return config('import.slik.chunk_size', 50);
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom CSV settings untuk optimasi pembacaan file
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getCsvSettings(): array
|
||||
{
|
||||
return [
|
||||
'input_encoding' => 'UTF-8',
|
||||
'delimiter' => ',',
|
||||
'enclosure' => '"',
|
||||
'escape_character' => '\\',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Process collection data dari Excel dengan optimasi memory
|
||||
*
|
||||
* @param Collection $collection
|
||||
* @return void
|
||||
*/
|
||||
public function collection(Collection $collection)
|
||||
{
|
||||
// Set memory limit dari konfigurasi
|
||||
$memoryLimit = config('import.slik.memory_limit', 1024);
|
||||
$currentMemoryLimit = ini_get('memory_limit');
|
||||
|
||||
if ($currentMemoryLimit !== '-1' && $this->convertToBytes($currentMemoryLimit) < $memoryLimit * 1024 * 1024) {
|
||||
ini_set('memory_limit', $memoryLimit . 'M');
|
||||
}
|
||||
|
||||
// Set timeout handler
|
||||
$timeout = config('import.slik.timeout', 1800);
|
||||
set_time_limit($timeout);
|
||||
|
||||
// Force garbage collection sebelum memulai
|
||||
if (config('import.slik.enable_gc', true)) {
|
||||
gc_collect_cycles();
|
||||
}
|
||||
|
||||
Log::info('SlikImport: Memulai import data', [
|
||||
'total_rows' => $collection->count(),
|
||||
'memory_usage' => memory_get_usage(true),
|
||||
'memory_peak' => memory_get_peak_usage(true),
|
||||
'memory_limit' => ini_get('memory_limit'),
|
||||
'php_version' => PHP_VERSION,
|
||||
'memory_limit_before' => $currentMemoryLimit,
|
||||
'config' => [
|
||||
'memory_limit' => $memoryLimit,
|
||||
'chunk_size' => $this->chunkSize(),
|
||||
'batch_size' => $this->batchSize()
|
||||
]
|
||||
]);
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
$processedRows = 0;
|
||||
$skippedRows = 0;
|
||||
$errorRows = 0;
|
||||
$totalRows = $collection->count();
|
||||
|
||||
foreach ($collection as $index => $row) {
|
||||
// Log progress setiap 25 baris untuk chunk lebih kecil
|
||||
if ($index % 25 === 0) {
|
||||
Log::info('SlikImport: Processing chunk', [
|
||||
'current_row' => $index + 5,
|
||||
'progress' => round(($index / max($totalRows, 1)) * 100, 2) . '%',
|
||||
'processed' => $processedRows,
|
||||
'skipped' => $skippedRows,
|
||||
'errors' => $errorRows,
|
||||
'memory_usage' => memory_get_usage(true),
|
||||
'memory_peak' => memory_get_peak_usage(true),
|
||||
'memory_diff' => memory_get_peak_usage(true) - memory_get_usage(true)
|
||||
]);
|
||||
}
|
||||
|
||||
// Skip baris kosong
|
||||
if ($this->isEmptyRow($row)) {
|
||||
$skippedRows++;
|
||||
Log::debug('SlikImport: Skipping empty row', ['row_number' => $index + 5]);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Validasi data
|
||||
if (!$this->validateRow($row)) {
|
||||
$errorRows++;
|
||||
Log::warning('SlikImport: Invalid row data', [
|
||||
'row_number' => $index + 5,
|
||||
'data' => $row->toArray()
|
||||
]);
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
// Map data dari Excel ke model
|
||||
$slikData = $this->mapRowToSlik($row);
|
||||
|
||||
// Update atau create berdasarkan no_rekening dan cif
|
||||
$slik = Slik::updateOrCreate(
|
||||
[
|
||||
'no_rekening' => $slikData['no_rekening'],
|
||||
'cif' => $slikData['cif']
|
||||
],
|
||||
$slikData
|
||||
);
|
||||
|
||||
$processedRows++;
|
||||
|
||||
// Log detail untuk baris pertama sebagai sample
|
||||
if ($index === 0) {
|
||||
Log::info('SlikImport: Sample data processed', [
|
||||
'slik_id' => $slik->id,
|
||||
'no_rekening' => $slik->no_rekening,
|
||||
'cif' => $slik->cif,
|
||||
'was_recently_created' => $slik->wasRecentlyCreated
|
||||
]);
|
||||
}
|
||||
|
||||
// Force garbage collection setiap 25 baris untuk mengurangi memory
|
||||
if (config('import.slik.enable_gc', true) && $index > 0 && $index % 25 === 0) {
|
||||
gc_collect_cycles();
|
||||
}
|
||||
|
||||
// Unset data yang sudah tidak digunakan untuk mengurangi memory
|
||||
if ($index > 0 && $index % 25 === 0) {
|
||||
unset($slikData, $slik);
|
||||
}
|
||||
|
||||
// Reset collection internal untuk mengurangi memory
|
||||
if ($index > 0 && $index % 100 === 0) {
|
||||
$collection = collect($collection->slice($index + 1)->values());
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
$errorRows++;
|
||||
Log::error('SlikImport: Error processing row', [
|
||||
'row_number' => $index + 5,
|
||||
'error' => $e->getMessage(),
|
||||
'data' => $row->toArray(),
|
||||
'memory_usage' => memory_get_usage(true)
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
|
||||
// Force garbage collection setelah selesai
|
||||
if (config('import.slik.enable_gc', true)) {
|
||||
gc_collect_cycles();
|
||||
}
|
||||
|
||||
// Cleanup variables
|
||||
unset($collection);
|
||||
|
||||
Log::info('SlikImport: Import berhasil diselesaikan', [
|
||||
'total_rows' => $totalRows,
|
||||
'processed_rows' => $processedRows,
|
||||
'skipped_rows' => $skippedRows,
|
||||
'error_rows' => $errorRows,
|
||||
'final_memory_usage' => memory_get_usage(true),
|
||||
'peak_memory_usage' => memory_get_peak_usage(true),
|
||||
'memory_saved' => memory_get_peak_usage(true) - memory_get_usage(true),
|
||||
'memory_efficiency' => ($processedRows > 0) ? round(memory_get_peak_usage(true) / $processedRows, 2) : 0
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
DB::rollBack();
|
||||
|
||||
// Force garbage collection jika error
|
||||
if (config('import.slik.enable_gc', true)) {
|
||||
gc_collect_cycles();
|
||||
}
|
||||
|
||||
$errorType = 'general';
|
||||
if (str_contains(strtolower($e->getMessage()), 'memory')) {
|
||||
$errorType = 'memory';
|
||||
} elseif (str_contains(strtolower($e->getMessage()), 'timeout') || str_contains(strtolower($e->getMessage()), 'maximum execution time')) {
|
||||
$errorType = 'timeout';
|
||||
}
|
||||
|
||||
Log::error('SlikImport: Error during import', [
|
||||
'error' => $e->getMessage(),
|
||||
'error_type' => $errorType,
|
||||
'exception_type' => get_class($e),
|
||||
'trace' => $e->getTraceAsString(),
|
||||
'file' => $e->getFile(),
|
||||
'line' => $e->getLine(),
|
||||
'memory_usage' => memory_get_usage(true),
|
||||
'memory_peak' => memory_get_peak_usage(true),
|
||||
'memory_limit' => ini_get('memory_limit'),
|
||||
'timeout_limit' => ini_get('max_execution_time'),
|
||||
'is_memory_error' => str_contains(strtolower($e->getMessage()), 'memory'),
|
||||
'is_timeout_error' => str_contains(strtolower($e->getMessage()), 'timeout') || str_contains(strtolower($e->getMessage()), 'maximum execution time')
|
||||
]);
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert memory limit string ke bytes
|
||||
*
|
||||
* @param string $memoryLimit
|
||||
* @return int
|
||||
*/
|
||||
private function convertToBytes(string $memoryLimit): int
|
||||
{
|
||||
$memoryLimit = trim($memoryLimit);
|
||||
$lastChar = strtolower(substr($memoryLimit, -1));
|
||||
$number = (int) substr($memoryLimit, 0, -1);
|
||||
|
||||
switch ($lastChar) {
|
||||
case 'g':
|
||||
return $number * 1024 * 1024 * 1024;
|
||||
case 'm':
|
||||
return $number * 1024 * 1024;
|
||||
case 'k':
|
||||
return $number * 1024;
|
||||
default:
|
||||
return (int) $memoryLimit;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Cek apakah baris kosong
|
||||
*
|
||||
* @param Collection $row
|
||||
* @return bool
|
||||
*/
|
||||
private function isEmptyRow(Collection $row): bool
|
||||
{
|
||||
return $row->filter(function ($value) {
|
||||
return !empty(trim($value));
|
||||
})->isEmpty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Validasi data baris
|
||||
*
|
||||
* @param Collection $row
|
||||
* @return bool
|
||||
*/
|
||||
private function validateRow(Collection $row): bool
|
||||
{
|
||||
// Validasi minimal: sandi_bank, no_rekening, dan cif harus ada
|
||||
return !empty(trim($row[0])) && // sandi_bank
|
||||
!empty(trim($row[5])) && // no_rekening
|
||||
!empty(trim($row[6])); // cif
|
||||
}
|
||||
|
||||
/**
|
||||
* Map data dari baris Excel ke array untuk model Slik
|
||||
*
|
||||
* @param Collection $row
|
||||
* @return array
|
||||
*/
|
||||
private function mapRowToSlik(Collection $row): array
|
||||
{
|
||||
return [
|
||||
'sandi_bank' => trim($row[0]) ?: null,
|
||||
'tahun' => $this->parseInteger($row[1]),
|
||||
'bulan' => $this->parseInteger($row[2]),
|
||||
'flag_detail' => trim($row[3]) ?: null,
|
||||
'kode_register_agunan' => trim($row[4]) ?: null,
|
||||
'no_rekening' => trim($row[5]) ?: null,
|
||||
'cif' => trim($row[6]) ?: null,
|
||||
'kolektibilitas' => trim($row[7]) ?: null,
|
||||
'fasilitas' => trim($row[8]) ?: null,
|
||||
'jenis_segmen_fasilitas' => trim($row[9]) ?: null,
|
||||
'status_agunan' => trim($row[10]) ?: null,
|
||||
'jenis_agunan' => trim($row[11]) ?: null,
|
||||
'peringkat_agunan' => trim($row[12]) ?: null,
|
||||
'lembaga_pemeringkat' => trim($row[13]) ?: null,
|
||||
'jenis_pengikatan' => trim($row[14]) ?: null,
|
||||
'tanggal_pengikatan' => $this->parseDate($row[15]),
|
||||
'nama_pemilik_agunan' => trim($row[16]) ?: null,
|
||||
'bukti_kepemilikan' => trim($row[17]) ?: null,
|
||||
'alamat_agunan' => trim($row[18]) ?: null,
|
||||
'lokasi_agunan' => trim($row[19]) ?: null,
|
||||
'nilai_agunan' => $this->parseDecimal($row[20]),
|
||||
'nilai_agunan_menurut_ljk' => $this->parseDecimal($row[21]),
|
||||
'tanggal_penilaian_ljk' => $this->parseDate($row[22]),
|
||||
'nilai_agunan_penilai_independen' => $this->parseDecimal($row[23]),
|
||||
'nama_penilai_independen' => trim($row[24]) ?: null,
|
||||
'tanggal_penilaian_penilai_independen' => $this->parseDate($row[25]),
|
||||
'jumlah_hari_tunggakan' => $this->parseInteger($row[26]),
|
||||
'status_paripasu' => trim($row[27]) ?: null,
|
||||
'prosentase_paripasu' => $this->parseDecimal($row[28]),
|
||||
'status_kredit_join' => trim($row[29]) ?: null,
|
||||
'diasuransikan' => trim($row[30]) ?: null,
|
||||
'keterangan' => trim($row[31]) ?: null,
|
||||
'kantor_cabang' => trim($row[32]) ?: null,
|
||||
'operasi_data' => trim($row[33]) ?: null,
|
||||
'kode_cabang' => trim($row[34]) ?: null,
|
||||
'nama_debitur' => trim($row[35]) ?: null,
|
||||
'nama_cabang' => trim($row[36]) ?: null,
|
||||
'flag' => trim($row[37]) ?: null,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse integer value
|
||||
*
|
||||
* @param mixed $value
|
||||
* @return int|null
|
||||
*/
|
||||
private function parseInteger($value): ?int
|
||||
{
|
||||
if (empty(trim($value))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (int) $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse decimal value
|
||||
*
|
||||
* @param mixed $value
|
||||
* @return float|null
|
||||
*/
|
||||
private function parseDecimal($value): ?float
|
||||
{
|
||||
if (empty(trim($value))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Remove currency formatting
|
||||
$cleaned = str_replace([',', '.'], ['', '.'], $value);
|
||||
$cleaned = preg_replace('/[^0-9.]/', '', $cleaned);
|
||||
|
||||
return (float) $cleaned;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse date value
|
||||
*
|
||||
* @param mixed $value
|
||||
* @return string|null
|
||||
*/
|
||||
private function parseDate($value): ?string
|
||||
{
|
||||
if (empty(trim($value))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
// Try to parse various date formats
|
||||
$date = \Carbon\Carbon::parse($value);
|
||||
return $date->format('Y-m-d');
|
||||
} catch (\Exception $e) {
|
||||
Log::warning('SlikImport: Invalid date format', [
|
||||
'value' => $value,
|
||||
'error' => $e->getMessage()
|
||||
]);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
156
app/Jobs/CleanupInspeksiDataJob.php
Normal file
156
app/Jobs/CleanupInspeksiDataJob.php
Normal file
@@ -0,0 +1,156 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Jobs;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Modules\Lpj\Models\Inspeksi;
|
||||
|
||||
/**
|
||||
* Job untuk membersihkan data inspeksi yang tidak memiliki dokument_id
|
||||
*
|
||||
* Case: Jika ada data inspeksi yang masuk dengan permohonan_id yang sama
|
||||
* tetapi memiliki dokument_id dan user created_by yang sama, maka
|
||||
* data lama (tanpa dokument_id) akan di-soft delete
|
||||
*/
|
||||
class CleanupInspeksiDataJob implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
public $timeout = 300; // 5 menit
|
||||
public $tries = 3;
|
||||
public $maxExceptions = 3;
|
||||
public $backoff = [60, 120, 300]; // Exponential backoff dalam detik
|
||||
|
||||
protected int $permohonanId;
|
||||
protected int $createdBy;
|
||||
protected ?int $dokumentId;
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*
|
||||
* @param int $permohonanId
|
||||
* @param int $createdBy
|
||||
* @param int|null $dokumentId
|
||||
*/
|
||||
public function __construct(int $permohonanId, int $createdBy, ?int $dokumentId = null)
|
||||
{
|
||||
$this->permohonanId = $permohonanId;
|
||||
$this->createdBy = $createdBy;
|
||||
$this->dokumentId = $dokumentId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*
|
||||
* @return void
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
Log::info('CleanupInspeksiDataJob: Memulai proses cleanup data inspeksi', [
|
||||
'permohonan_id' => $this->permohonanId,
|
||||
'created_by' => $this->createdBy,
|
||||
'dokument_id' => $this->dokumentId
|
||||
]);
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
// Cari data inspeksi yang memiliki dokument_id (data baru)
|
||||
$newInspeksi = Inspeksi::where('permohonan_id', $this->permohonanId)
|
||||
->where('created_by', $this->createdBy)
|
||||
->whereNotNull('dokument_id')
|
||||
->whereNull('deleted_at')
|
||||
->first();
|
||||
|
||||
if (!$newInspeksi) {
|
||||
Log::warning('CleanupInspeksiDataJob: Tidak ditemukan data inspeksi baru dengan dokument_id', [
|
||||
'permohonan_id' => $this->permohonanId,
|
||||
'created_by' => $this->createdBy
|
||||
]);
|
||||
DB::rollBack();
|
||||
return;
|
||||
}
|
||||
|
||||
Log::info('CleanupInspeksiDataJob: Data inspeksi baru ditemukan', [
|
||||
'inspeksi_id' => $newInspeksi->id,
|
||||
'dokument_id' => $newInspeksi->dokument_id
|
||||
]);
|
||||
|
||||
// Cari data inspeksi lama yang tidak memiliki dokument_id
|
||||
$oldInspeksiList = Inspeksi::where('permohonan_id', $this->permohonanId)
|
||||
->where('created_by', $this->createdBy)
|
||||
->whereNull('dokument_id')
|
||||
->whereNull('deleted_at')
|
||||
->where('id', '!=', $newInspeksi->id) // Jangan hapus data yang baru saja ditemukan
|
||||
->get();
|
||||
|
||||
if ($oldInspeksiList->isEmpty()) {
|
||||
Log::info('CleanupInspeksiDataJob: Tidak ditemukan data inspeksi lama tanpa dokument_id', [
|
||||
'permohonan_id' => $this->permohonanId,
|
||||
'created_by' => $this->createdBy
|
||||
]);
|
||||
DB::commit();
|
||||
return;
|
||||
}
|
||||
|
||||
$deletedCount = 0;
|
||||
foreach ($oldInspeksiList as $oldInspeksi) {
|
||||
// Soft delete data lama
|
||||
$oldInspeksi->delete(); // Menggunakan soft delete karena model menggunakan SoftDeletes trait
|
||||
|
||||
Log::info('CleanupInspeksiDataJob: Data inspeksi lama berhasil di-soft delete', [
|
||||
'old_inspeksi_id' => $oldInspeksi->id,
|
||||
'permohonan_id' => $oldInspeksi->permohonan_id,
|
||||
'created_by' => $oldInspeksi->created_by,
|
||||
'deleted_at' => now()->toDateTimeString()
|
||||
]);
|
||||
|
||||
$deletedCount++;
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
|
||||
Log::info('CleanupInspeksiDataJob: Proses cleanup selesai', [
|
||||
'permohonan_id' => $this->permohonanId,
|
||||
'created_by' => $this->createdBy,
|
||||
'deleted_count' => $deletedCount,
|
||||
'new_inspeksi_id' => $newInspeksi->id
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
DB::rollBack();
|
||||
|
||||
Log::error('CleanupInspeksiDataJob: Terjadi error saat proses cleanup', [
|
||||
'permohonan_id' => $this->permohonanId,
|
||||
'created_by' => $this->createdBy,
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString()
|
||||
]);
|
||||
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle a job failure.
|
||||
*
|
||||
* @param \Throwable $exception
|
||||
* @return void
|
||||
*/
|
||||
public function failed(\Throwable $exception): void
|
||||
{
|
||||
Log::error('CleanupInspeksiDataJob: Job gagal dieksekusi', [
|
||||
'permohonan_id' => $this->permohonanId,
|
||||
'created_by' => $this->createdBy,
|
||||
'error' => $exception->getMessage(),
|
||||
'trace' => $exception->getTraceAsString()
|
||||
]);
|
||||
}
|
||||
}
|
||||
179
app/Jobs/ProcessSlikImport.php
Normal file
179
app/Jobs/ProcessSlikImport.php
Normal file
@@ -0,0 +1,179 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Jobs;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Modules\Lpj\Imports\SlikImport;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
|
||||
class ProcessSlikImport implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
public $timeout = 1800; // 30 menit untuk file besar
|
||||
public $tries = 5; // Tambah retry untuk file sangat besar
|
||||
public $maxExceptions = 5;
|
||||
public $backoff = [60, 300, 900, 1800, 3600]; // Exponential backoff dalam detik
|
||||
|
||||
protected string $filePath;
|
||||
protected int $userId;
|
||||
protected string $importId;
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*
|
||||
* @param string $filePath
|
||||
* @param int $userId
|
||||
* @param string $importId
|
||||
*/
|
||||
public function __construct(string $filePath, int $userId, string $importId)
|
||||
{
|
||||
$this->filePath = $filePath;
|
||||
$this->userId = $userId;
|
||||
$this->importId = $importId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
Log::info('ProcessSlikImport: Memulai proses import via queue', [
|
||||
'file_path' => $this->filePath,
|
||||
'user_id' => $this->userId,
|
||||
'import_id' => $this->importId,
|
||||
'memory_limit' => ini_get('memory_limit'),
|
||||
'max_execution_time' => ini_get('max_execution_time')
|
||||
]);
|
||||
|
||||
try {
|
||||
// Cek file size terlebih dahulu
|
||||
$fileSize = filesize($this->filePath);
|
||||
$maxFileSize = config('import.slik.max_file_size', 50) * 1024 * 1024; // Convert MB to bytes
|
||||
|
||||
if ($fileSize > $maxFileSize) {
|
||||
throw new \Exception('File terlalu besar: ' . number_format($fileSize / 1024 / 1024, 2) . ' MB. Maksimum: ' . config('import.slik.max_file_size', 50) . ' MB');
|
||||
}
|
||||
|
||||
// Set optimasi memory untuk queue processing
|
||||
$memoryLimit = config('import.slik.memory_limit', 1024);
|
||||
ini_set('memory_limit', $memoryLimit . 'M');
|
||||
ini_set('max_execution_time', config('import.slik.timeout', 1800));
|
||||
|
||||
// Set timeout untuk XML Scanner
|
||||
$xmlScannerTimeout = config('import.slik.xml_scanner.timeout', 1800);
|
||||
$xmlScannerMemory = config('import.slik.xml_scanner.memory_limit', 1024);
|
||||
|
||||
// Enable garbage collection jika diizinkan
|
||||
if (config('import.slik.enable_gc', true)) {
|
||||
gc_enable();
|
||||
}
|
||||
|
||||
// Update progress status
|
||||
$this->updateProgress('processing', 0, 'Memproses file Excel...');
|
||||
|
||||
Log::info('SlikImport: Processing file', [
|
||||
'file' => basename($this->filePath),
|
||||
'file_size' => number_format(filesize($this->filePath) / 1024 / 1024, 2) . ' MB',
|
||||
'memory_limit' => $memoryLimit . 'M',
|
||||
'timeout' => config('import.slik.timeout', 1800),
|
||||
'enable_gc' => config('import.slik.enable_gc', true),
|
||||
'xml_scanner_timeout' => config('import.slik.xml_scanner.timeout', 1800),
|
||||
'chunk_size' => config('import.slik.chunk_size', 50),
|
||||
'batch_size' => config('import.slik.batch_size', 50),
|
||||
]);
|
||||
|
||||
// Import file menggunakan SlikImport
|
||||
$import = new SlikImport();
|
||||
Excel::import($import, $this->filePath);
|
||||
|
||||
// Update progress selesai
|
||||
$this->updateProgress('completed', 100, 'Import berhasil diselesaikan');
|
||||
|
||||
Log::info('ProcessSlikImport: Import berhasil diselesaikan', [
|
||||
'import_id' => $this->importId,
|
||||
'file_path' => $this->filePath,
|
||||
'memory_usage' => memory_get_usage(true),
|
||||
'memory_peak' => memory_get_peak_usage(true)
|
||||
]);
|
||||
|
||||
// Hapus file temporary setelah selesai
|
||||
if (config('import.general.cleanup_temp_files', true)) {
|
||||
Storage::delete($this->filePath);
|
||||
Log::info('ProcessSlikImport: File temporary dihapus', ['file_path' => $this->filePath]);
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
// Update progress error
|
||||
$this->updateProgress('failed', 0, 'Error: ' . $e->getMessage());
|
||||
|
||||
Log::error('ProcessSlikImport: Error saat proses import', [
|
||||
'import_id' => $this->importId,
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString(),
|
||||
'file' => $e->getFile(),
|
||||
'line' => $e->getLine(),
|
||||
'memory_usage' => memory_get_usage(true)
|
||||
]);
|
||||
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update progress import
|
||||
*
|
||||
* @param string $status
|
||||
* @param int $percentage
|
||||
* @param string $message
|
||||
* @return void
|
||||
*/
|
||||
private function updateProgress(string $status, int $percentage, string $message): void
|
||||
{
|
||||
if (config('import.slik.progress.enabled', true)) {
|
||||
$cacheKey = config('import.slik.progress.cache_key', 'slik_import_progress') . '_' . $this->importId;
|
||||
$cacheTtl = config('import.slik.progress.cache_ttl', 3600);
|
||||
|
||||
$progressData = [
|
||||
'status' => $status,
|
||||
'percentage' => $percentage,
|
||||
'message' => $message,
|
||||
'timestamp' => now(),
|
||||
'user_id' => $this->userId
|
||||
];
|
||||
|
||||
cache()->put($cacheKey, $progressData, $cacheTtl);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle job failure
|
||||
*
|
||||
* @param \Throwable $exception
|
||||
* @return void
|
||||
*/
|
||||
public function failed(\Throwable $exception): void
|
||||
{
|
||||
Log::error('ProcessSlikImport: Job failed', [
|
||||
'import_id' => $this->importId,
|
||||
'error' => $exception->getMessage(),
|
||||
'trace' => $exception->getTraceAsString()
|
||||
]);
|
||||
|
||||
// Update progress ke failed
|
||||
$this->updateProgress('failed', 0, 'Import gagal: ' . $exception->getMessage());
|
||||
|
||||
// Cleanup file temporary
|
||||
if (Storage::exists($this->filePath)) {
|
||||
Storage::delete($this->filePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
33
app/Jobs/SendJadwalKunjunganEmailJob.php
Normal file
33
app/Jobs/SendJadwalKunjunganEmailJob.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Jobs;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Modules\Lpj\Emails\SendJadwalKunjunganEmail;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
|
||||
class SendJadwalKunjunganEmailJob implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
protected $emailData;
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct(array $emailData)
|
||||
{
|
||||
$this->emailData = $emailData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
Mail::to($this->emailData['email'])->send(new SendJadwalKunjunganEmail($this->emailData));
|
||||
}
|
||||
}
|
||||
72
app/Jobs/SendPenawaranKJPPTenderJob.php
Normal file
72
app/Jobs/SendPenawaranKJPPTenderJob.php
Normal file
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Jobs;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Modules\Lpj\Emails\SendPenawaranKJPPEmail;
|
||||
|
||||
class SendPenawaranKJPPTenderJob implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
protected $kjpps;
|
||||
protected $dp1; // Tidak perlu array [0] lagi
|
||||
protected $penawaran;
|
||||
protected $permohonan;
|
||||
protected $villages;
|
||||
protected $districts;
|
||||
protected $cities;
|
||||
protected $provinces;
|
||||
protected $user;
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct($kjpps, $dp1, $penawaran, $permohonan, $villages, $districts, $cities, $provinces, $user)
|
||||
{
|
||||
$this->kjpps = $kjpps;
|
||||
$this->dp1 = $dp1; // Simpan keseluruhan array dp1, bukan dp1[0]
|
||||
$this->penawaran = $penawaran;
|
||||
$this->permohonan = $permohonan;
|
||||
$this->villages = $villages;
|
||||
$this->districts = $districts;
|
||||
$this->cities = $cities;
|
||||
$this->provinces = $provinces;
|
||||
$this->user = $user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
$email = new SendPenawaranKJPPEmail(
|
||||
$this->dp1,
|
||||
$this->penawaran,
|
||||
$this->permohonan,
|
||||
$this->villages,
|
||||
$this->districts,
|
||||
$this->cities,
|
||||
$this->provinces,
|
||||
$this->user // Kirim user ke email sebagai cc dan bcc
|
||||
);
|
||||
|
||||
$email->with([
|
||||
'dp1' => $this->dp1, // Kirim seluruh array dp1 ke email
|
||||
'penawaran' => $this->penawaran,
|
||||
'permohonan' => $this->permohonan,
|
||||
'villages' => $this->villages,
|
||||
'districts' => $this->districts,
|
||||
'cities' => $this->cities,
|
||||
'provinces' => $this->provinces,
|
||||
'user' => $this->user // Kirim user ke email sebagai cc dan bcc
|
||||
]);
|
||||
|
||||
$send = Mail::to($this->kjpps)->send($email);
|
||||
}
|
||||
}
|
||||
59
app/Jobs/SendPenawaranTenderJob.php
Normal file
59
app/Jobs/SendPenawaranTenderJob.php
Normal file
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Lpj\Jobs;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Modules\Lpj\Emails\SendPenawaranTenderEmail;
|
||||
|
||||
class SendPenawaranTenderJob implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
protected $kjpps;
|
||||
protected $penawaran;
|
||||
protected $permohonan;
|
||||
protected $villages;
|
||||
protected $districts;
|
||||
protected $cities;
|
||||
protected $provinces;
|
||||
protected $user; // Tidak perlu array [0] lagi
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*/
|
||||
public function __construct($kjpps, $penawaran, $permohonan, $villages, $districts, $cities, $provinces,$user)
|
||||
{
|
||||
$this->kjpps = $kjpps;
|
||||
$this->penawaran = $penawaran;
|
||||
$this->permohonan = $permohonan;
|
||||
$this->villages = $villages;
|
||||
$this->districts = $districts;
|
||||
$this->cities = $cities;
|
||||
$this->provinces = $provinces;
|
||||
$this->user = $user; // Simpan user yang dikirim email ke properti
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
$email = new SendPenawaranTenderEmail();
|
||||
$email->with([
|
||||
'penawaran' => $this->penawaran,
|
||||
'permohonan' => $this->permohonan,
|
||||
'villages' => $this->villages,
|
||||
'districts' => $this->districts,
|
||||
'cities' => $this->cities,
|
||||
'provinces' => $this->provinces,
|
||||
'user' => $this->user // Kirim user ke email ke properti sebagai additional data
|
||||
]);
|
||||
|
||||
Mail::to($this->kjpps)->send($email);
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user