# `Sp_Check_sSiv` (procedure)

> 销售发票单据保存之前数据校验


- **Type:** PROCEDURE
- **Deterministic:** NO
- **SQL data access:** CONTAINS SQL

## Parameters

| # | Mode | Name | Type |
|---|---|---|---|
| 1 | IN | `sTableName` | `varchar(100)` |
| 2 | IN | `sGuid` | `varchar(100)` |
| 3 | IN | `sFormGuid` | `varchar(100)` |
| 4 | IN | `sLoginId` | `varchar(100)` |
| 5 | IN | `sBrId` | `varchar(100)` |
| 6 | IN | `sSuId` | `varchar(100)` |
| 7 | IN | `iFlag` | `int` |
| 8 | OUT | `sCode` | `int` |
| 9 | OUT | `sReturn` | `varchar(4000)` |

## Body

_Body is not pre-cached. To inspect: `mysql --defaults-file=~/.my.cnf -e 'SHOW CREATE PROCEDURE `Sp_Check_sSiv`'`._

## Narrative

**Business context:** 销售管理 → 销售送货流程 → 销售发票单据 — post-save validator on `salsalesinvoicemaster`/`salsalesinvoiceslave`. Enforces that one invoice cannot mix 材料销售 (CLDD-prefixed) and 成品销售 orders, classifies `sBussinessType` from the source order, recomputes 不含税/税额 from `sistax`, converts foreign-currency totals via `siscurrency`, and re-derives `tGetPayDate` from the customer's 收款条件 (`sispayment.iAfterDeliverDay`).

**What it does:** Counts distinct `sFormId` across the slave's source orders — aborts with `sMaterialSaleProductCantInvoice` if >1. Updates `sBussinessType` based on `sOrderNo` prefix, rewrites slave `dProductNoTaxMoney`/`dProductTaxMoney` via `sistax.dRate`, recomputes `dProductMoney` from qty×price when drift >0.1, copies `sBillType` from `salsalesorderslave`, refreshes `dProductForeignMoney` from `dCurrencyRate`. On form `1691254111217011538642820` (manual-entry variant) cross-checks `dTotalMoney = dProductNoTaxMoney + dProductTaxMoney` per slave and aborts with `sProductTaxNotSame` if any product mismatches. Computes `tGetPayDate = tInvoiceDate + sispayment.iAfterDeliverDay`. Recomputes `dRemainderQty`/`dCostQty` for partial returns. When `bAdvance=1`, derives master 税额/不含税/外币 from `dAdvanceMoney`. Builds a temp table to validate that total invoiced qty per `sSrcSlaveId` does not exceed the upstream 对账 qty (`salsalescheckingslave`).

**Invocation:** Bound to `gdsmodule.sSaveProName` on `销售发票单据` (sId `15780358080007074056281633539000`) — 销售管理 → 销售送货流程 (KPI流程操作菜单). Dispatched by `BusinessBaseServiceImpl.checkUpdate(..., "sSaveProName")` after the save batch commits. Pre-save peer is `Sp_beforeSave_sSiv`.
