# `Sp_Calc_sSiv` (procedure) > 销售发票 - **Type:** PROCEDURE - **Deterministic:** NO - **SQL data access:** CONTAINS SQL ## Parameters | # | Mode | Name | Type | |---|---|---|---| | 1 | IN | `iFlag` | `int` | | 2 | IN | `iTmpCheck` | `int` | | 3 | IN | `sFormGuid` | `varchar(100)` | | 4 | IN | `sGuid` | `varchar(100)` | | 5 | IN | `sLoginId` | `varchar(100)` | | 6 | OUT | `sReturn` | `varchar(4000)` | | 7 | IN | `sBrId` | `varchar(100)` | | 8 | IN | `sSuId` | `varchar(100)` | | 9 | OUT | `sCode` | `int` | ## Body _Body is not pre-cached. To inspect: `mysql --defaults-file=~/.my.cnf -e 'SHOW CREATE PROCEDURE `Sp_Calc_sSiv`'`._ ## Narrative **Business context:** 销售管理 → 销售发票 (sales invoice — `salsalesinvoicemaster`) audit / un-audit. Auditing a 销售发票 commits the AR (accounts-receivable) row, freezes the linked 对账单/送货单/退货 lines, and optionally posts an operator KPI. **What it does:** Validates `sGuid`/`bInvalid` and reads `viw_salsalesinvoice` for context; on `iFlag=1` sets `bCheck=1`, `sCheckPerson`, `tCheckDate` on `SalSalesInvoiceMaster`/`SalSalesInvoiceSlave`; writes-back `Update salsalescheckingmaster`/`SalSalesCheckingSlave` (对账 freeze), `saldelivernotifyslave`, `salrejectgoodsslave`; `INSERT INTO CahReceivables` to post the AR row and `Update CahCustomerInit`/`CahFinancialAdjust` to refresh customer balance; logs an optional `kpidetail` row; calls `Sp_System_CheckFlow` per slave when define-check is on. `iFlag=0` reverses every step (`Delete FROM CahReceivables`, clear flags, undo writeback). **Invocation:** Bound to `gdsmodule.sProcName` on: - `销售发票单据` (sId `15780358080007074056281633539000`) — also `sSaveProName=Sp_Check_sSiv`, `sSaveProNameBefore=Sp_beforeSave_sSiv`, `sDeleteProName=Sp_afterSave_sSiv` - `销售发票明细` (sId `15777565190004256392637270378500`) Dispatched by `BusinessBaseServiceImpl.getPrcName(sFormGuid, …)` on the 审核/反审核 button — the standard `Sp_Calc_s` slot. xly-src has multiple patches (`optimize/`, `upgrade/20220104审核去除结账校验/`, customer-side `Demo3.sql`) — verify which is deployed.