|
@@ -39,12 +39,34 @@ CREATE TABLE IF NOT EXISTS "ReviewRewardCorrection" (
|
|
|
"sourceBatchId" text, "adjustmentBatchId" text, "adjustmentRequestId" text,
|
|
"sourceBatchId" text, "adjustmentBatchId" text, "adjustmentRequestId" text,
|
|
|
UNIQUE(company,"rewardId"), FOREIGN KEY("rewardId") REFERENCES "ReviewReward"("objectId")
|
|
UNIQUE(company,"rewardId"), FOREIGN KEY("rewardId") REFERENCES "ReviewReward"("objectId")
|
|
|
);
|
|
);
|
|
|
|
|
+-- Preserve every column and correction rule while allowing tenant/month predicates
|
|
|
|
|
+-- to reach the indexed receipt table before projecting corrected amounts.
|
|
|
CREATE OR REPLACE VIEW "ReviewRewardIncome" AS
|
|
CREATE OR REPLACE VIEW "ReviewRewardIncome" AS
|
|
|
- SELECT projected.*,r.amount AS "originalAmount",c."objectId" AS "correctionId",c.reason AS "correctionReason",c.amount AS "correctionAmount",c."adjustmentBatchId"
|
|
|
|
|
- FROM "ReviewReward" r LEFT JOIN "ReviewRewardCorrection" c ON c.company=r.company AND c."rewardId"=r."objectId"
|
|
|
|
|
- CROSS JOIN LATERAL jsonb_populate_record(NULL::"ReviewReward",to_jsonb(r)||jsonb_build_object(
|
|
|
|
|
- 'amount',r.amount+COALESCE(c.amount,0),'status',CASE WHEN c."objectId" IS NULL THEN r.status ELSE 'ineligible' END,
|
|
|
|
|
- 'ineligibleReason',CASE WHEN c."objectId" IS NULL THEN r."ineligibleReason" ELSE 'corrected_overdue' END)) projected;
|
|
|
|
|
|
|
+SELECT
|
|
|
|
|
+ r."objectId",
|
|
|
|
|
+ r."company",
|
|
|
|
|
+ r."taskId",
|
|
|
|
|
+ r."taskKey",
|
|
|
|
|
+ r."coachId",
|
|
|
|
|
+ r."coachName",
|
|
|
|
|
+ r."studentId",
|
|
|
|
|
+ r."studentName",
|
|
|
|
|
+ r."courseName",
|
|
|
|
|
+ r."storeId",
|
|
|
|
|
+ r."storeName",
|
|
|
|
|
+ r."plannedDate",
|
|
|
|
|
+ r."completedAt",
|
|
|
|
|
+ r."incomeMonth",(r.amount+COALESCE(c.amount,0))::numeric(12,2) AS amount,
|
|
|
|
|
+ CASE WHEN c."objectId" IS NULL THEN r.status ELSE 'ineligible' END AS status,
|
|
|
|
|
+ r."exception",
|
|
|
|
|
+ r."createdAt",
|
|
|
|
|
+ CASE WHEN c."objectId" IS NULL THEN r."ineligibleReason" ELSE 'corrected_overdue' END AS "ineligibleReason",
|
|
|
|
|
+ r.amount AS "originalAmount",
|
|
|
|
|
+ c."objectId" AS "correctionId",
|
|
|
|
|
+ c.reason AS "correctionReason",
|
|
|
|
|
+ c.amount AS "correctionAmount",
|
|
|
|
|
+ c."adjustmentBatchId"
|
|
|
|
|
+FROM "ReviewReward" r LEFT JOIN "ReviewRewardCorrection" c ON c.company=r.company AND c."rewardId"=r."objectId";
|
|
|
CREATE OR REPLACE FUNCTION xs_review_correction_guard() RETURNS trigger LANGUAGE plpgsql AS $$
|
|
CREATE OR REPLACE FUNCTION xs_review_correction_guard() RETURNS trigger LANGUAGE plpgsql AS $$
|
|
|
BEGIN
|
|
BEGIN
|
|
|
IF TG_OP<>'INSERT' OR current_setting('xiaoshu.review_correction',true) IS DISTINCT FROM 'yes' THEN RAISE EXCEPTION '工资纠正凭据只能由核对事务新增,不能改写或删除'; END IF;
|
|
IF TG_OP<>'INSERT' OR current_setting('xiaoshu.review_correction',true) IS DISTINCT FROM 'yes' THEN RAISE EXCEPTION '工资纠正凭据只能由核对事务新增,不能改写或删除'; END IF;
|