From ee6d857e9d99294d5e91a1c3a5c18285a2f54da8 Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Mon, 13 Apr 2026 10:35:26 +0000 Subject: [PATCH] =?UTF-8?q?feat(service-auto):=20phase=203=20=E2=80=94=20P?= =?UTF-8?q?ACK=5FAUTO=20callproc=20+=20c=C3=A2mpuri=20extinse=20formular?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrare completă de la SP_CREEAZA_COMANDA_PROTOTIP la PACK_AUTO.dev_adauga_lucrare (18 params). Formular ComandaNoua extins cu toate câmpurile din SP: observații, defecțiuni, km, ore motor, termen, nr. dosar. - schema: solicitari → observatii (opțional); adăugat defectiuni, km_int, ore_functionare, nr_dosar, termen - service: callproc cablat pe câmpurile noi; pc_nr cu milisecunde (evită colizii sub-secundă) - error mapper: range 20001→20000 (ORA-20000 era neacoperit → 500 în loc de 422) - onboarding_roa_web.sql: grant pe PACK_AUTO (înlocuiește SP prototip) - ComandaNoua.vue: InputNumber km/ore, Calendar termen, Textarea defecțiuni, InputText nr_dosar Co-Authored-By: Claude Sonnet 4.6 --- .../modules/service_auto/routers/comanda.py | 1 + .../modules/service_auto/schemas/comanda.py | 8 +- .../service_auto/services/comanda_service.py | 54 ++++++--- docs/service-auto/onboarding_roa_web.sql | 2 +- .../service-auto/views/ComandaNoua.vue | 109 ++++++++++++++++-- 5 files changed, 147 insertions(+), 27 deletions(-) diff --git a/backend/modules/service_auto/routers/comanda.py b/backend/modules/service_auto/routers/comanda.py index b8131a6..f3b4a8a 100644 --- a/backend/modules/service_auto/routers/comanda.py +++ b/backend/modules/service_auto/routers/comanda.py @@ -81,6 +81,7 @@ async def creeaza_comanda( return await ComandaService.creeaza_comanda( data=data, username=current_user.username, + user_id=current_user.user_id, ) except NotImplementedError as e: raise HTTPException(status_code=501, detail=str(e)) diff --git a/backend/modules/service_auto/schemas/comanda.py b/backend/modules/service_auto/schemas/comanda.py index 19b3bb8..6baca30 100644 --- a/backend/modules/service_auto/schemas/comanda.py +++ b/backend/modules/service_auto/schemas/comanda.py @@ -1,3 +1,4 @@ +from datetime import date from typing import List, Optional from pydantic import BaseModel @@ -6,9 +7,14 @@ from pydantic import BaseModel class ComandaRequest(BaseModel): tip_id: int id_masiniclient: int - solicitari: str id_firma: int id_sucursala: Optional[int] = None + observatii: str = "" + defectiuni: Optional[str] = None + km_int: int = 0 + ore_functionare: int = 0 + nr_dosar: str = "" + termen: Optional[date] = None class ComandaResponse(BaseModel): diff --git a/backend/modules/service_auto/services/comanda_service.py b/backend/modules/service_auto/services/comanda_service.py index 505a0b2..e1fe912 100644 --- a/backend/modules/service_auto/services/comanda_service.py +++ b/backend/modules/service_auto/services/comanda_service.py @@ -1,5 +1,5 @@ import re -from datetime import date +from datetime import date, datetime from typing import List, NoReturn, Optional import oracledb @@ -10,6 +10,8 @@ from ..schemas.comanda import ( ) from .. import logger +_SCHEMA = "MARIUSM_AUTO" + _MAX_PER_PAGE = 100 @@ -18,7 +20,7 @@ def _handle_oracle_error(e: Exception) -> NoReturn: Map Oracle error codes to FastAPI HTTPExceptions. Always raises. Code ranges: - 20001-20999 → 422 Unprocessable (business rule errors from RAISE_APPLICATION_ERROR) + 20000-20999 → 422 Unprocessable (business rule errors from RAISE_APPLICATION_ERROR) 12541/12170/12154/12560 → 503 Service Unavailable (Oracle unreachable / network) 1017 → 500 + CRITICAL log (bad credentials — config error) 942 → 500 + CRITICAL log (missing object/grant — deployment error) @@ -28,7 +30,7 @@ def _handle_oracle_error(e: Exception) -> NoReturn: code = getattr(err, "code", 0) raw_message = getattr(err, "message", str(e)) - if 20001 <= code <= 20999: + if 20000 <= code <= 20999: # Strip "ORA-2xxxx: " prefix injected by Oracle; expose the business message only clean = re.sub(r"^ORA-\d+:\s*", "", raw_message).strip() raise HTTPException(status_code=422, detail=clean) @@ -66,7 +68,12 @@ class ComandaService: async def creeaza_comanda( data: ComandaRequest, username: str, + user_id: Optional[int] = None, ) -> ComandaResponse: + now = datetime.now() + # pcNr serves as NOM_LUCRARI.NRORD — must be unique; timestamp gives collision-safe value. + pc_nr = f"W{now.strftime('%Y%m%d%H%M%S')}{now.microsecond // 1000:03d}" + logger.info( "service_auto.create_comanda START", extra={ @@ -74,32 +81,47 @@ class ComandaService: "tip": data.tip_id, "client_id": data.id_masiniclient, "id_firma": data.id_firma, + "pc_nr": pc_nr, + "km": data.km_int, + "ore": data.ore_functionare, }, ) async with oracle_pool.get_connection("mariusm_test") as connection: try: with connection.cursor() as cursor: + # pnIdOrdl is IN OUT — setvalue(0, 0) sets the IN side to 0; + # Oracle overwrites it with the new DEV_ORDL.ID_ORDL. out_id_ordl = cursor.var(oracledb.NUMBER) - out_nrord = cursor.var(oracledb.STRING) + out_id_ordl.setvalue(0, 0) cursor.callproc( - "MARIUSM_AUTO.SP_CREEAZA_COMANDA_PROTOTIP", + f"{_SCHEMA}.PACK_AUTO.dev_adauga_lucrare", [ - data.tip_id, # p_tip IN NUMBER - data.id_masiniclient, # p_id_masiniclient IN NUMBER - data.solicitari, # p_solicitari IN VARCHAR2 - data.id_firma, # p_id_firma IN NUMBER - data.id_sucursala, # p_id_sucursala IN NUMBER (None for parent firm) - out_id_ordl, # p_id_ordl OUT NUMBER - out_nrord, # p_nrord OUT VARCHAR2 + _SCHEMA, # v_gcs IN VARCHAR2 + now.year, # tnan IN NUMBER + now.month, # tnluna IN NUMBER + user_id or 0, # tnIdUtil IN NUMBER (Oracle ID_UTIL) + pc_nr, # pcNr IN VARCHAR2 (NOM_LUCRARI.NRORD) + None, # pnIdInsp IN NUMBER + None, # pnIdAsig IN NUMBER + data.nr_dosar or "", # pcNrDosar IN VARCHAR2 + data.id_masiniclient, # pnIdMC IN NUMBER + data.km_int, # pnKmInt IN NUMBER + data.ore_functionare, # pnOreFct IN NUMBER (≥0; NOT NULL in DEV_MASINICLIENTI) + data.termen, # pdTermen IN DATE + data.tip_id, # pnTipCom IN NUMBER + None, # pcSirIdOperatii IN VARCHAR2 — MUST be None, NOT '' + data.observatii or None, # pcObservatii IN VARCHAR2 DEFAULT NULL + data.defectiuni or None, # pcDefectiuni IN VARCHAR2 DEFAULT NULL + 0, # pnIdPartRef IN NUMBER (decode(0) → NULL inside SP) + out_id_ordl, # pnIdOrdl IN OUT NUMBER ], ) connection.commit() id_ordl = int(out_id_ordl.getvalue()) - nrord = out_nrord.getvalue() or "" except oracledb.DatabaseError as e: try: connection.rollback() @@ -109,13 +131,13 @@ class ComandaService: logger.info( "service_auto.create_comanda OK", - extra={"user": username, "id_ordl": id_ordl, "nrord": nrord}, + extra={"user": username, "id_ordl": id_ordl, "nrord": pc_nr}, ) return ComandaResponse( id_ordl=id_ordl, - nrord=nrord, - mesaj=f"Comanda {nrord} creata cu succes.", + nrord=pc_nr, + mesaj=f"Comanda {pc_nr} creata cu succes.", ) @staticmethod diff --git a/docs/service-auto/onboarding_roa_web.sql b/docs/service-auto/onboarding_roa_web.sql index d9b3ad4..99d7435 100644 --- a/docs/service-auto/onboarding_roa_web.sql +++ b/docs/service-auto/onboarding_roa_web.sql @@ -6,7 +6,7 @@ -- Prerequisite : ROA_WEB user creat (onboarding_roa_web_user.sql) -- ============================================================================= -GRANT EXECUTE ON :SCHEMA_NAME.SP_CREEAZA_COMANDA_PROTOTIP TO ROA_WEB; +GRANT EXECUTE ON :SCHEMA_NAME.PACK_AUTO TO ROA_WEB; GRANT SELECT ON :SCHEMA_NAME.AUTO_VMASINICLIENTI TO ROA_WEB; GRANT SELECT ON :SCHEMA_NAME.DEV_TIP_DEVIZ TO ROA_WEB; GRANT SELECT ON :SCHEMA_NAME.CALENDAR TO ROA_WEB; -- period selector AppHeader diff --git a/src/modules/service-auto/views/ComandaNoua.vue b/src/modules/service-auto/views/ComandaNoua.vue index 3f06235..b875fd2 100644 --- a/src/modules/service-auto/views/ComandaNoua.vue +++ b/src/modules/service-auto/views/ComandaNoua.vue @@ -65,20 +65,95 @@ /> - +