Skip to content

Commit dde22e1

Browse files
committed
Merge pull request #114 from diepxuan/feature/bao-no-sua-xoa
Fix stored procedure calls: AsCAInsPH2 và ProcedureCaller
1 parent cf677c9 commit dde22e1

4 files changed

Lines changed: 207 additions & 12 deletions

File tree

src/StoredProcedures/AsCAInsPH2.php

Lines changed: 187 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,207 @@
88
* @author Tran Ngoc Duc <ductn@diepxuan.com>
99
* @author Tran Ngoc Duc <caothu91@gmail.com>
1010
*
11-
* @lastupdate 2026-02-12 13:15:00
11+
* @lastupdate 2026-03-18 23:58:00
1212
*/
1313

1414
namespace Diepxuan\Simba\StoredProcedures;
1515

1616
use Diepxuan\Simba\SModel\SModel;
1717
use Illuminate\Support\Collection;
1818

19+
/**
20+
* Class AsCAInsPH2.
21+
*
22+
* Stored procedure: asCAInsPH2
23+
* Mục đích: Thêm mới phiếu thu/chi (bảng CAPH2 - Cash Phiếu 2).
24+
* Procedure thực hiện insert bản ghi mới vào bảng CAPH2 với đầy đủ thông tin chứng từ thu/chi tiền mặt.
25+
*
26+
* Tham số (theo định nghĩa thực tế trong SQL Server):
27+
* - @pMa_cty (nvarchar(3)): Mã công ty. Bắt buộc.
28+
* - @pStt_rec (nvarchar(20)): Số tham chiếu (stt_rec). Bắt buộc.
29+
* - @pMa_ct (nvarchar(3)): Mã chứng từ (loại chứng từ). Bắt buộc.
30+
* - @pSo_ct (nvarchar(12)): Số chứng từ. Bắt buộc.
31+
* - @pNgay_ct (smalldatetime): Ngày chứng từ. Bắt buộc.
32+
* - @pNgay_lct (smalldatetime): Ngày lập chứng từ. Bắt buộc.
33+
* - @pKht_tain (bit): Kế hoạch tài chính. Default 0.
34+
* - @pMa_kh (nvarchar(20)): Mã khách hàng. Default ''.
35+
* - @pDia_chi (nvarchar(255)): Địa chỉ. Default ''.
36+
* - @pNguoi_gd (nvarchar(30)): Người giao dịch. Default ''.
37+
* - @pDien_giai (nvarchar(255)): Diễn giải nội dung. Bắt buộc.
38+
* - @pTk_co (nvarchar(20)): Tài khoản có. Bắt buộc.
39+
* - @pMa_nt (nvarchar(3)): Mã ngoại tệ. Bắt buộc.
40+
* - @pTy_gia (decimal(19,4)): Tỷ giá. Default 1.0.
41+
* - @pT_tien_nt (decimal(19,4)): Tổng tiền nguyên tệ. Default 0.0.
42+
* - @pT_tien (decimal(19,4)): Tổng tiền quy đổi. Default 0.0.
43+
* - @pT_Thue (decimal(19,4)): Tổng thuế. Default 0.0.
44+
* - @pT_Tt_nt (decimal(19,4)): Tổng thanh toán nguyên tệ. Default 0.0.
45+
* - @pT_Tt (decimal(19,4)): Tổng thanh toán. Default 0.0.
46+
* - @pTrang_thai (nvarchar(1)): Trạng thái chứng từ. Default ''.
47+
* - @pPost2gl (nvarchar(1)): Đã post sang GL. Default ''.
48+
* - @pLUser (nvarchar(20)): Người dùng thực hiện. Bắt buộc.
49+
* - @pRet (int, OUTPUT): Tham số đầu ra chứa mã lỗi (@@error).
50+
* - 0: Thành công.
51+
* - Khác 0: Mã lỗi SQL Server.
52+
*
53+
* Giá trị trả về:
54+
* - Procedure không trả về result set.
55+
* - Kết quả được trả về qua output parameter @pRet.
56+
* - Để lấy giá trị @pRet, cần đọc từ result của ProcedureCaller (có SELECT @pRet).
57+
*
58+
* Ví dụ gọi:
59+
* ```php
60+
* $result = AsCAInsPH2::call([
61+
* 'pMa_cty' => '001',
62+
* 'pStt_rec' => '001wCA40000000676668',
63+
* 'pMa_ct' => 'CA4',
64+
* 'pSo_ct' => 'BN02944',
65+
* 'pNgay_ct' => '2026-02-12',
66+
* 'pNgay_lct' => '2026-02-24',
67+
* 'pKht_tain' => 0,
68+
* 'pMa_kh' => 'CCNHUNGGOI',
69+
* 'pDien_giai' => 'thanh toán 12.02.26',
70+
* 'pTk_co' => '11217',
71+
* 'pMa_nt' => 'VND',
72+
* 'pTy_gia' => 1,
73+
* 'pT_tien_nt' => 142000000,
74+
* 'pT_tien' => 142000000,
75+
* 'pT_Tt_nt' => 142000000,
76+
* 'pT_Tt' => 142000000,
77+
* 'pLUser' => 'DUCTN',
78+
* ]);
79+
*
80+
* // Lấy giá trị output parameter
81+
* $ret = $result->first()->pRet ?? null;
82+
* if ($ret === 0) {
83+
* // Insert thành công
84+
* } else {
85+
* // Có lỗi xảy ra, $ret chứa mã lỗi
86+
* }
87+
* ```
88+
*
89+
* Lưu ý:
90+
* - Procedure chỉ thực hiện insert, không kiểm tra trùng số chứng từ.
91+
* - Cần gọi `asChkSoCt` trước để đảm bảo số chứng từ không trùng.
92+
* - Output parameter @pRet được xử lý tự động bởi ProcedureCaller.
93+
*
94+
* @see AsChkSoCt::call() - Kiểm tra trùng số chứng từ trước khi insert
95+
*/
1996
class AsCAInsPH2
2097
{
98+
/**
99+
* Gọi stored procedure asCAInsPH2.
100+
*
101+
* @param array $params Mảng tham số với các khóa tương ứng tên tham số.
102+
* Các parameters có thể thiếu, sẽ dùng giá trị default.
103+
*
104+
* @return Collection Kết quả từ procedure (chứa output parameter pRet).
105+
*/
21106
public static function call(array $params): Collection
22107
{
23108
$connection = (new SModel())->getConnectionName();
24109

25110
return ProcedureCaller::call('asCAInsPH2', [
26-
111+
'pMa_cty' => $params['pMa_cty'] ?? null,
112+
'pStt_rec' => $params['pStt_rec'] ?? null,
113+
'pMa_ct' => $params['pMa_ct'] ?? null,
114+
'pSo_ct' => $params['pSo_ct'] ?? null,
115+
'pNgay_ct' => $params['pNgay_ct'] ?? null,
116+
'pNgay_lct' => $params['pNgay_lct'] ?? null,
117+
'pKht_tain' => $params['pKht_tain'] ?? 0,
118+
'pMa_kh' => $params['pMa_kh'] ?? '',
119+
'pDia_chi' => $params['pDia_chi'] ?? '',
120+
'pNguoi_gd' => $params['pNguoi_gd'] ?? '',
121+
'pDien_giai' => $params['pDien_giai'] ?? null,
122+
'pTk_co' => $params['pTk_co'] ?? null,
123+
'pMa_nt' => $params['pMa_nt'] ?? null,
124+
'pTy_gia' => $params['pTy_gia'] ?? 1.0,
125+
'pT_tien_nt' => $params['pT_tien_nt'] ?? 0.0,
126+
'pT_tien' => $params['pT_tien'] ?? 0.0,
127+
'pT_Thue' => $params['pT_Thue'] ?? 0.0,
128+
'pT_Tt_nt' => $params['pT_Tt_nt'] ?? 0.0,
129+
'pT_Tt' => $params['pT_Tt'] ?? 0.0,
130+
'pTrang_thai' => $params['pTrang_thai'] ?? '',
131+
'pPost2gl' => $params['pPost2gl'] ?? '',
132+
'pLUser' => $params['pLUser'] ?? null,
133+
'pRet' => ['type' => 'INT', 'output' => true],
27134
], $connection);
28135
}
136+
137+
/**
138+
* Call stored procedure asCAInsPH2 with named parameters (helper method).
139+
*
140+
* @param string|null $Ma_cty Mã công ty
141+
* @param string|null $Stt_rec Số tham chiếu
142+
* @param string|null $Ma_ct Mã chứng từ
143+
* @param string|null $So_ct Số chứng từ
144+
* @param string|null $Ngay_ct Ngày chứng từ
145+
* @param string|null $Ngay_lct Ngày lập chứng từ
146+
* @param int|float $Kht_tain Kế hoạch tài chính
147+
* @param string|null $Ma_kh Mã khách hàng
148+
* @param string|null $Dia_chi Địa chỉ
149+
* @param string|null $Nguoi_gd Người giao dịch
150+
* @param string|null $Dien_giai Diễn giải
151+
* @param string|null $Tk_co Tài khoản có
152+
* @param string|null $Ma_nt Mã ngoại tệ
153+
* @param float|null $Ty_gia Tỷ giá
154+
* @param float|null $T_tien_nt Tổng tiền nguyên tệ
155+
* @param float|null $T_tien Tổng tiền quy đổi
156+
* @param float|null $T_Thue Tổng thuế
157+
* @param float|null $T_Tt_nt Tổng thanh toán nguyên tệ
158+
* @param float|null $T_Tt Tổng thanh toán
159+
* @param string|null $Trang_thai Trạng thái
160+
* @param string|null $Post2gl Đã post GL
161+
* @param string|null $LUser Người dùng
162+
*
163+
* @return Collection Kết quả từ procedure
164+
*/
165+
public static function callWithParams(
166+
?string $Ma_cty = null,
167+
?string $Stt_rec = null,
168+
?string $Ma_ct = null,
169+
?string $So_ct = null,
170+
?string $Ngay_ct = null,
171+
?string $Ngay_lct = null,
172+
$Kht_tain = 0,
173+
?string $Ma_kh = null,
174+
?string $Dia_chi = null,
175+
?string $Nguoi_gd = null,
176+
?string $Dien_giai = null,
177+
?string $Tk_co = null,
178+
?string $Ma_nt = null,
179+
?float $Ty_gia = null,
180+
?float $T_tien_nt = null,
181+
?float $T_tien = null,
182+
?float $T_Thue = null,
183+
?float $T_Tt_nt = null,
184+
?float $T_Tt = null,
185+
?string $Trang_thai = null,
186+
?string $Post2gl = null,
187+
?string $LUser = null,
188+
): Collection {
189+
return self::call([
190+
'pMa_cty' => $Ma_cty,
191+
'pStt_rec' => $Stt_rec,
192+
'pMa_ct' => $Ma_ct,
193+
'pSo_ct' => $So_ct,
194+
'pNgay_ct' => $Ngay_ct,
195+
'pNgay_lct' => $Ngay_lct,
196+
'pKht_tain' => $Kht_tain,
197+
'pMa_kh' => $Ma_kh,
198+
'pDia_chi' => $Dia_chi,
199+
'pNguoi_gd' => $Nguoi_gd,
200+
'pDien_giai' => $Dien_giai,
201+
'pTk_co' => $Tk_co,
202+
'pMa_nt' => $Ma_nt,
203+
'pTy_gia' => $Ty_gia,
204+
'pT_tien_nt' => $T_tien_nt,
205+
'pT_tien' => $T_tien,
206+
'pT_Thue' => $T_Thue,
207+
'pT_Tt_nt' => $T_Tt_nt,
208+
'pT_Tt' => $T_Tt,
209+
'pTrang_thai' => $Trang_thai,
210+
'pPost2gl' => $Post2gl,
211+
'pLUser' => $LUser,
212+
]);
213+
}
29214
}

src/StoredProcedures/AsChkSoCt.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* @author Tran Ngoc Duc <ductn@diepxuan.com>
99
* @author Tran Ngoc Duc <caothu91@gmail.com>
1010
*
11-
* @lastupdate 2026-02-25 15:38:21
11+
* @lastupdate 2026-03-18 23:38:43
1212
*/
1313

1414
namespace Diepxuan\Simba\StoredProcedures;
@@ -101,6 +101,12 @@ public static function call(array $params): Collection
101101
$connection = (new SModel())->getConnectionName();
102102

103103
return ProcedureCaller::call('asChkSoCt', [
104+
'pMa_cty' => $params['pMa_cty'] ?? null,
105+
'pMa_ct' => $params['pMa_ct'] ?? null,
106+
'pStt_rec' => $params['pStt_rec'] ?? null,
107+
'pSo_ct' => $params['pSo_ct'] ?? null,
108+
'pNgay_Ct' => $params['pNgay_Ct'] ?? null,
109+
'pRet' => ['type' => 'INT', 'output' => true],
104110
], $connection);
105111
}
106112
}

src/StoredProcedures/AsGetSttRec.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* @author Tran Ngoc Duc <ductn@diepxuan.com>
99
* @author Tran Ngoc Duc <caothu91@gmail.com>
1010
*
11-
* @lastupdate 2026-02-13 00:03:56
11+
* @lastupdate 2026-03-18 23:42:19
1212
*/
1313

1414
namespace Diepxuan\Simba\StoredProcedures;
@@ -23,9 +23,9 @@ public static function call(array $params): Collection
2323
$connection = (new SModel())->getConnectionName();
2424

2525
return ProcedureCaller::call('asGetSttRec', [
26-
'pMa_cty' => $params['pMa_cty'] ?? null,
27-
'pMa_ct' => $params['pMa_ct'] ?? null,
28-
'pStt_rec' => $params['pStt_rec'] ?? null
26+
'pMa_cty' => $params['pMa_cty'] ?? null,
27+
'pMa_ct' => $params['pMa_ct'] ?? null,
28+
'pStt_rec' => ['type' => 'NVARCHAR(20)', 'output' => true],
2929
], $connection);
3030
}
3131
}

src/StoredProcedures/ProcedureCaller.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,13 @@ public static function call(string $name, array $params = [], ?string $connectio
3838
$execParts = [];
3939
$bindings = [];
4040
$selectOut = [];
41+
$hasOutput = false;
4142

4243
foreach ($params as $key => $value) {
4344
// Nếu là OUTPUT param
4445
if (\is_array($value) && ($value['output'] ?? false)) {
4546
$type = $value['type'] ?? 'INT';
47+
$hasOutput = true;
4648

4749
$declareSql[] = "DECLARE @{$key} {$type}";
4850
$execParts[] = "@{$key} = @{$key} OUTPUT";
@@ -53,21 +55,23 @@ public static function call(string $name, array $params = [], ?string $connectio
5355
}
5456
}
5557
$sql = '';
58+
// Thêm SET NOCOUNT ON để tránh multiple result sets từ procedure
59+
$sql .= "SET NOCOUNT ON;\n";
5660
if (!empty($declareSql)) {
5761
$sql .= implode(";\n", $declareSql) . ";\n";
5862
}
5963
$sql .= "EXEC {$name}\n " . implode(",\n ", $execParts);
64+
65+
// Thêm SELECT để fetch output values (phải cùng batch với DECLARE)
6066
if (!empty($selectOut)) {
6167
$sql .= ";\nSELECT " . implode(', ', $selectOut);
6268
}
69+
6370
$conn = $connection ? DB::connection($connection) : DB::connection();
71+
72+
// Dùng select() để execute toàn bộ batch và fetch kết quả
6473
$rows = $conn->select($sql, $bindings);
6574

6675
return collect($rows);
67-
// Lấy giá trị của các tham số theo thứ tự
68-
// $bindings = array_values($params);
69-
70-
// Thực thi stored procedure
71-
// return DB::select($sql, $bindings);
7276
}
7377
}

0 commit comments

Comments
 (0)