Release v4928.1.4.2 stable
This commit is contained in:
44
scripts/replace_jasmin_document_for_opportunity.py
Executable file
44
scripts/replace_jasmin_document_for_opportunity.py
Executable file
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Replace imported Jasmin quotation/proforma details for an opportunity.
|
||||
|
||||
Use this when an old/closed quotation was linked by mistake and a newer open
|
||||
reconciliation item should become the active document for the opportunity.
|
||||
This deletes only ClientFlow imported Jasmin quotation/proforma artifacts; it does
|
||||
not delete documents in Jasmin.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import asyncio
|
||||
import json
|
||||
from decimal import Decimal
|
||||
from typing import Any
|
||||
|
||||
|
||||
def _json_default(value: Any) -> str:
|
||||
if isinstance(value, Decimal):
|
||||
return str(value)
|
||||
return str(value)
|
||||
|
||||
|
||||
async def main() -> int:
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--opportunity-id", required=True)
|
||||
parser.add_argument("--item-id", required=True, help="reconciliation_items.id for the open/valid Jasmin candidate")
|
||||
parser.add_argument("--dry-run", action="store_true")
|
||||
args = parser.parse_args()
|
||||
|
||||
from app.jasmin_backfill_service import replace_jasmin_document_for_opportunity_async
|
||||
|
||||
result = await replace_jasmin_document_for_opportunity_async(
|
||||
opportunity_id=args.opportunity_id,
|
||||
item_id=args.item_id,
|
||||
actor="operator_cli_replace_jasmin_document",
|
||||
dry_run=args.dry_run,
|
||||
)
|
||||
print(json.dumps(result, ensure_ascii=False, indent=2, default=_json_default))
|
||||
return 0 if result.get("ok") else 2
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(asyncio.run(main()))
|
||||
Reference in New Issue
Block a user