[X3]Compilation d'un traitement de plus 6500 lignes impossible

SUGGESTED

Bonjour , avez-vous déjà rencontré cette limite dans Eclipse ou dans la fenêtre Traitement de X3 qui empêche de compiler des traitements trop longs ?

Il y a t il un variable système permettant de passer outre cette restriction  ?

D'avance merci

AM

  • 0

    Bonjour,

    Oui, sur un grand traitement on peut avoir une erreur, qui oblige à le découper, un peu comme c'est le cas avec les traitements standards SUBSOH, les actions de l'étiquette $ACTION sont traités dans SUBSOHA, SUBSOHA1, SUBSOHC

    La limite a été revue à la hausse avec les derniers runtime v12 (arrivés en 12.0.20)

    Nicolas

  • 0
    SUGGESTED

    Bonjour Alban,

    De mémoire, avant la mise à jour runtime RT 92 la limite était de 3000 lignes.

    Aujourd'hui je ne connais pas la limite mais j'ai des traitements de 20000 lignes qui compilent bel et bien (la compilation est plus lente mais cela fonctionne bien).

    Si quelqu'un à le chiffre ou la contrainte autre en place, cela peut être intéressant ?

    Cordialement,

    Laurent

  • 0 in reply to L.V. Expertise X3

    Bonjour ,

    merci pour votre réponse , je suis étonné que vous soyez arrivé à dépasser le cap des 6500 lignes , nous on découpe nos programmes pour passer outre cette restriction.

    Il doit bien y avoir un paramètre pour augmenter la taille du buffer.

    Laissons ce post ouvert en espérant que nous ayons une réponse.

    bonne journée

  • 0 in reply to Alban-M

    Bonjour Alban,

    Je ne peux vous fournir mon traitement afin de tester mais j'ai compilé des sources SUBSOH dans un seul traitement de 19305 lignes qui compile et s’exécute sur un moteur 93.3.45 avec Eclipse et plugin en dernière version.

    Ci-dessous le traitement de test :

    #<AdxTL>@(#)0.0.0.0 $Revision$
    Infbox func TEST20000("Mon paramètre")
    
    End
    
    #########################################################################
    # Contient les traitements des actions appelés par l'objet SUBSOH       #
    # Etiquettes                                                            #
    #########################################################################
    # Issue 112736 - 20160119 by LD : import de commande issue d'un devis
    # Issue 113857 - 20160128 by LD : Désallocation commande contremarque signée
    # Issue 121688 - 20170315 by LD : Authorized credit level reached mess when duplicate SOF: KO
    # Issue X3-38651 - 20170526 by LD : SOF Project link initialized with the SO header value
    # Issue X3-59732 - 20171227 by LD : Use of [M] in cide rather than exact mask causes problem when custom screen is last to be used [131017-2D1F3]
    # Issue X3-128239 - 20190214 by LD : Error Variable Non-existent WALLTXT
    # Issue X3-160406 - 2019-10-11 by SR : In all cases, Bill to Customer must be active
    # Issue X3-243690 - 2021-05-17 by MRDAB - new Prepayment invoice/contract fields on GESSOH
    # Issue X3-244837 - 2021-05-24 by MRDAB - feed the new Prepayment invoice/contract fields
    # Issue X3-243729 - 2021-05-31 SDEM --> deletion SO lines contracts with status create
    # Issue X3-246053 - 2021-08-06 by MRDAB - control header fields vs GESPREPI and update GESPREPI
    #########################################################################
    $RECOVERED_AUPDTICK
      # FGR 07/07/2015 : X3SUIVI109276
      Read [SOH]=
      If dim([L]AUPDTICK) > 0 and dim([F]updTick) > 0 Then
        [L]AUPDTICK = [F:SOH]updTick
      Endif
      Gosub KILL_RECOVERED_AUPDTICK
    Return
    
    #########################################################################
    $FORCE_RECOVERED_AUPDTICK
      # FGR 07/07/2015 : X3SUIVI109276
      If dim(GSOHFRCAUPDTICK) < 0 Then
        Global Integer GSOHFRCAUPDTICK
      Endif
    Return
    
    #########################################################################
    $KILL_RECOVERED_AUPDTICK
      # FGR 07/07/2015 : X3SUIVI109276
      If dim(GSOHFRCAUPDTICK) >= 0 Then
        Kill GSOHFRCAUPDTICK
      Endif
    Return
    
    #########################################################################
    $AV_IMPRIME
    #---------------------------------------------------------------#
    # avant impression alimentation du no document                  #
    #---------------------------------------------------------------#
    If [M:SOH0]DOCNAM<>""
       [L]AREPORT=[M:SOH0]DOCNAM
    Elsif WSLTDOCNAM<>""
       [L]AREPORT=WSLTDOCNAM
    Endif
    Return
    
    #########################################################################
    $AP_IMPRIME
    #---------------------------------------------------------------#
    # apres une impression il faut etre sur d'etre sur le bon enreg #
    #---------------------------------------------------------------#
    Gosub RELIT From GOBJSUB
    #MAE, le 23/01/08, bg45433
    Raz [L]AREPORT
    Return
    
    #- X3Suivi 69847 Génération commande depuis devis --#
    #########################################################################
    $AFFMASK
    Local Integer I, J, OK, WRETOUR
    
    # Pas de saisie no commande si on vient des devis
    If find(GFONC1,"GESSQH") : Diszo [SOH0]SOHNUM : Endif
    
    If GCREPARBOU = 1
       If GFONC1="GESSQH"
          Gosub GEN_COM From SUBSOHB
          Raz GCREPARBOU
          CLE1 = [F:SOH]SOHNUM
       Endif
    
    Endif
    
    Return
    
    #########################################################################
    # FGR 07/07/2015 : X3SUIVI109276 : déplacé dans SUBSOHA1
    #$OUVRE
    ##-----------------------------------#
    ## Sauvegarde des variables globales #
    ##-----------------------------------#
    #Gosub SAUV_GLOB From TRTX3GLOB
    #
    #Global Char     GNUM(GLONVCR)
    #Global Shortint GREV           : # 0 = la question n'a pas été posée
    #                                 # 1 = sans avenant / 2 = avec avenant
    #Global Shortint GINVTYP        : # 1 = facture / 2 = avoir / 5 = proforma
    #Global Char     GTARFLG(1)     : # Flag recalcul des tarifs
    #Global Integer  GCDTUNL        : # Flag déblocage crédit autorise
    #Global Integer  GDACLOK        : # Flag ctrl qté, prix, marge, montant mini
    #Global Integer  GPRIMOD        : # Flag modif des prix/remises
    #Global Char     GLOCCAT(4)     : # Pour filtrer les catégories d'emplacements
    #Global Integer  GSOHSUPPLIGDSP : #--CPO 79343 Afin d'afficher un message si suppr ligne et doc ori avec elts fact
    ## Filtre catégorie emplacement pour le contrôle et la sélection emplacement
    #GLOCCAT="12"
    #
    #Raz GWIP, GLOCSEL
    #
    #Local  Char     YSQHNUM(GLONVCR)
    #Local  Integer  WPICK
    #Local Char      CODE (3)
    #Local Integer   RETOUR, TYP12
    #Local Shortint  IBOX
    #Local Shortint  MODPTE            : # Flag modification de la condition de paiement
    #Local  Decimal  WQUOATI, WQUONOT  : # En devis
    #Local Shortint  MODBPCINV         : #--CPO 82311 Flag modification du client facture
    #Local Shortint  MODBPCPYR         : #--CPO 82311 Flag modification du tiers payeur
    #
    #If !clalev([F:SID]) : Local File SINVOICED [SID] : Endif  # FGR 27/04/2009 : X3SUIVI54600
    #If clalev([F:DUD])=0 : Local File GACCDUDATE [DUD] : Endif :#--CPO 82311
    #
    #GVENCFG=2
    #
    #If GMODU(7)=2 GLOCSEL = "[F:STC]LOCCAT<>3&[F:STC]LOCCAT<>4" Endif
    #Raz GREV
    #
    #If !clalev([F:TCA])  Local File TABCOUAFF  [TCA] Endif
    #
    #If !clalev([F:GCM])  Local File GACM       [GCM] Endif
    #
    #If !clalev([F:ACV])  Local File ACTIV      [ACV]   Endif
    ##Global Integer GACTMUL : GACTMUL=1    : # Globale multisociété : 1(non) / 2(oui)
    ##Read [ACV] CODACT="MUL" : If fstat  Raz [F:ACV] : Endif
    ##If [F:ACV]FLACT=2 GACTMUL=2 Endif
    #Local Char WPARAM(10)
    ##--------------------------------------------------------------#
    ## Chargement param.utilisateur déblocage crédit autorisé       #
    ##--------------------------------------------------------------#
    #Call PARAMUTIL("SCDTUNL",WPARAM,"","") From SUBAUS
    #GCDTUNL=val(WPARAM)
    #If GCDTUNL=0 GCDTUNL=1 Endif
    ##--------------------------------------------------------------#
    ## Chargement param.utilisateur ctrl qte,prix,marge,montant mini#
    ##--------------------------------------------------------------#
    #Call PARAMUTIL("SDACLOK",WPARAM,"","") From SUBAUS
    #GDACLOK=val(WPARAM)
    #If GDACLOK=0 GDACLOK=1 Endif
    ##------------------------------------------------------------#
    ## Chargement param.utilisateur modif des prix/remises        #
    ##------------------------------------------------------------#
    #Call PARAMUTIL("SPRIMOD",WPARAM,"","") From SUBAUS
    #GPRIMOD=val(WPARAM)
    #If GPRIMOD=0 GPRIMOD=1 Endif
    ##------------------------------------------------------------#
    ##              Chargements liés aux tarifs                   #
    ##------------------------------------------------------------#
    ## Contrôle existence de la structure tarif par défaut        #
    ## Chargement des variables globales pour la recherche tarif  #
    ## Récupération de la structure des frais/remises             #
    ## Récupération des types de frais/remises                    #
    ##              des no éléments facturation                   #
    ##------------------------------------------------------------#
    #GORITITCOL=1
    ##If GACTMUL=2
    #GPLISTC="néant" :# Pour forcer l'affichage des entêtes de colonne si structure=""
    ##Endif
    #Call CTLSTRUCT (1,RETOUR) From TRTPRICE
    #If RETOUR <>0: OK=0: Return :Endif
    #Call TARIFCHGT(5)         From TRTPRICE
    #Call COLREM("C",1,"")     From TRTPRICE
    #Call TYPREM(1,"")  From TRTPRICE
    ##------------------------------------------------------------#
    #
    #Global Char     GFOCITMREF
    #Global Decimal  GFOCQTY
    #Global Char     GFOCUOM, GPNTITMREF
    #Global Shortint GFOCMOTIF
    #Global Shortint GFOCFLG, GFOCPRIFLG
    #
    #If dim(GWEBSERV)=1 & GWEBSERV=1
    #    Read [ACV] CODACT="SOH" : If fstat  Raz [F:ACV] : Endif
    #    Global Char     GWEBFOCITMREF(GLONITM)(0..([F:ACV]DIME-1))
    #    Global Decimal  GWEBFOCQTY            (0..[F:ACV]DIME-1)
    #    Global Char     GWEBFOCUOM(GLONUOM)   (0..[F:ACV]DIME-1)
    #    Global Shortint GWEBFOCMOTIF          (0..[F:ACV]DIME-1)
    #    Global Shortint GWEBNBGRA : Raz GWEBNBGRA
    #    # Bug 57682
    #
    #    If !clalev([M:ACL])   Local Mask ACLOB  [ACL]  : Endif
    #    If !clalev([M:ACL1])  Local Mask ACLOB  [ACL1] : Endif
    #    If !clalev([M:ACL2])  Local Mask ACLOB  [ACL2] : Endif
    #
    #    If clalev([F:TXC])=0 : Local File TEXCLOB [TXC] : Endif
    #    #-----
    #    If dim([L]WRET)<1  Local Integer WRET : Endif
    #
    #    #----- Gestion des adresses
    #    Local Integer SAVGACTSAD : SAVGACTSAD=GACTSAD : GACTSAD=2
    #    If clalev([F:TCY])=0 : Local File TABCOUNTRY [TCY] : Endif
    #    # Bug 57682
    #Endif
    #
    #If GIMPORT Gosub SETTRANS_DEF From SUBSOHA1 Endif
    #
    #Raz GSOC_ACTIVE
    #GFCY = GFCYDEF (5)
    ## Ctrl site par défaut par rapport au critère, si aucun site par défaut, charge le 1er site correspondant au critere
    #Call GETFCYDEF(GFCY,"[F:FCY]SALFLG=2") From TRTX3
    ## Chargement globales référenciels, comptes et sections de la société
    #Gosub CHARG_PARAM : If GERR=1 OK=0 : Return Endif
    ## --- Déclaration des fenetres d'adresses ------------- #
    ## Bug 70949
    #If clalev([M:ADB1])=0
    #    Local Mask ADRBPC [ADB1]                     : # Déclaration de l'écran d'adresse ADB1
    #Else
    #  If !clalev([M:ADBV])
    #    Local Mask ADRBPC [ADBV] : [M:ADBV]=[M:ADB1] : # Sauvegarde de l'écran d'adresse ADB1 à cause de la navigation
    #  Endif
    #Endif
    #If clalev([M:ADB2])=0
    #    Local Mask ADRBPC [ADB2]                     : # Déclaration de l'écran d'adresse ADB1
    #Else
    #  If !clalev([M:ADBW])
    #    Local Mask ADRBPC [ADBW] : [M:ADBW]=[M:ADB2] : # Sauvegarde de l'adresse ADB2 à cause de la navigation
    #  Endif
    #Endif
    #If clalev([M:ADB3])=0
    #    Local Mask ADRBPC [ADB3]                     : # Déclaration de l'écran d'adresse ADB1
    #Else
    #  If !clalev([M:ADBX])
    #    Local Mask ADRBPC [ADBX] : [M:ADBX]=[M:ADB3] : # Sauvegarde de l'adresse ADB2 à cause de la navigation
    #  Endif
    #Endif
    ## Bug 70949
    #
    #Raz [M:ADB1], [M:ADB2], [M:ADB3]
    ## --- Déclaration classe ecran pour les allocations --- #
    #If clalev([M:STOK])=0 Local Mask STOK [STOK] Endif
    #Raz [M:STOK]
    ## --- Déclaration classe ecran pour les allocations --- #
    #If clalev([M:ALP])=0 Local Mask ALLPAR [ALP] Endif
    #Raz [M:ALP]
    ## --- Déclaration classe ecran pour les encours --- #
    #If clalev([M:ORDK])=0 Local Mask ORDK [ORDK] Endif
    #Raz [M:ORDK]
    #
    ## --- Déclaration classe ecran pour le configurateur --- #
    #Gosub OPEN_CFG From CFGLIB
    #
    ##----------------------------
    ## V6 Affectations
    #Gosub OPEN_MTO From MTOLINKLIB
    #
    #If GMODU(6)=2
    #    If clalev([F:POQ])=0 : Local File PORDERQ [POQ] : Endif
    ##    If GOPTCANA>0
    #    If GNBDIE>0
    #        # A cause de l'INISEC "SOH" et "SOP" qui peut être paramétré avec [F:POH] et [F:POP]
    #        If clalev([F:POH])=0 : Local File PORDER  [POH] : Endif
    #        If clalev([F:POP])=0 : Local File PORDERP [POP] : Endif
    #    Endif
    #Endif
    ## --- Ouverture + reservations pour repartition elts facturation a la ligne ----
    #Gosub OUV_DSPLIN From TRTVENFACC
    #
    ## -- ACA -- Ouverture du tableau de stockage des éléments facture
    #Local Char SFIT_OBJ : SFIT_OBJ="SOH"
    #Gosub INIT_SFIT From SUBSFIT
    #
    ## Detail local tax data
    #Gosub OUVRE_LTA From TRTTAXSST   # 106867.n
    ## Gosub OUVRE_LTA From TRTTAXUSA   # 106867.o
    #
    #Gosub DECLARE From TABLEAUX
    #
    #Return
    
    # ------------------------------------------------------------------------------------------------------------ #
    # Suppression des boutons                                                                                      #
    # ------------------------------------------------------------------------------------------------------------ #
    #     H : Changement de code                                                                                   #
    #     A : Supprimer  : Si cde préparée, livrée, facturée                                                       #
    #     1 : Allocation : Si aucune cde ou si cde alloc. auto ou si cde soldée                                    #
    #                         ou si cde non signée et pas d'encours ou pas d'alloc des cdes non signées            #
    #                         ou si tout est préparé et/ou livré                                                   #
    #                      Si aucune ligne gérée en stock                                                          #
    #     2 : Livraison  : Si aucune cde ou cde à facturation directe ou si cde soldée                             #
    #                         ou si cde non signée                                                                 #
    #     3 : Facture    : Si aucune cde ou non cde à facturation directe ou si cde soldée                         #
    #                         ou si cde non signée                                                                 #
    #     4 : Proforma   : Si aucune cde, si cde partiel.liv ou fac, si cde non signée                             #
    #                      Si cde inter-site, si cde prêt ou si déjà proforma                                      #
    #     5 : Solde      : Si aucune cde, si cde soldée, ou solde non autorisé                                     #
    #                      Si cde préparée                                                                         #
    #                      Si cde inter-site générée par le module achat                                           #
    #     6 : Préparation: Si aucune cde ou cde à facturation directe ou si cde soldée                             #
    #                         ou si plus rien à préparer, si cde non signée                                        #
    # ------------------------------------------------------------------------------------------------------------ #
    #$SETBOUT
    #Local Integer I
    #Local Decimal WPREQTY
    #
    #WPREQTY=sum([M:SOH4]LPRQTY,[M:SOH4]OPRQTY,[M:SOH4]PREQTY)
    ## 100013 : Une ligne sur liste de prépa peut être allouée mais pas préparée
    ##Local Integer WALL_PRE_STA : # Bug 76907
    #Local Integer WALL_STA
    #Local Integer WPRE_STA
    ## 100013
    #Local Integer WLIV_STA      : # 107888 : Scheduled invoices : (LD:01/06/16)
    #Gosub SETB_VERIF_QTY        : # Bug 76907
    #
    # Si l'on vient d'ailleurs suppression du bouton créér et des accès aux autres enr.
    #MAE, on ne supprim epas l'accés au bouton créer si on vient des clients
    #If GFONC1 <> "GESSOH"
    #  If GPILNAV>1
    #    If !find(GNAVIG(GPILNAV-1),"GESBPC")
    #      Call VIREBOUT(CHAINE,"RCDH<>S09") From GOBJET
    #    Endif
    #  Else
    #    Call VIREBOUT(CHAINE,"RCDH<>S09") From GOBJET
    #  Endif
    #Endif
    ##--CPO fin
    #
    ## Pas de bouton "Livraison","Facture","Proforma" et "Préparation"
    ## si l'on vient par tunnel des livraisons ou factures
    #If find(GFONC1,"GESSDH","GESSIH")
    #   Call VIREBOUT(CHAINE,"2346") From GOBJET
    #Endif
    ## Bug 39742 : Si mode consultation, il faut désactiver les boutons
    #If GCONSULT
    #   Call VIREBOUT(CHAINE,"123456") From GOBJET
    #Endif
    #Call VIREBOUT(CHAINE,"H") From GOBJET
    #If !CLECUR | [M]DLVSTA <> 1 | [M]INVSTA <> 1 | WPREQTY<>0
    #   Call VIREBOUT(CHAINE,"A") From GOBJET
    #Endif
    #If GREP <> "" | CLECUR = 0 | [M:SOH1]ORDSTA = 2 | ([M:SOH1]APPFLG<3 & (GSOHAPPORD=1 | GSOHAPPALL=1)) |
    #&  sum([M:SOH4]STOMGTCOD) = [M:SOH4]NBLIG |
    #&  WALL_STA = 0       : # 100013 : Une ligne sur liste de prépa peut âtre allouée mais pas préparée
    ##&  WALL_PRE_STA = 0  : # 100013
    ##&  sum([M:SOH4]LPRQTY,[M:SOH4]OPRQTY,[M:SOH4]PREQTY,[M:SOH4]ODLQTY,[M:SOH4]DLVQTY)>=sum([M:SOH4]QTY) : # Bug 76907
    #   Call VIREBOUT(CHAINE,"1") From GOBJET
    #Endif
    #If GREP <> "" | [M:SOH0]SOHCAT = 3  | CLECUR = 0 | [M:SOH1]ORDSTA = 2 | [M:SOH1]APPFLG<3
    #   Call VIREBOUT(CHAINE,"2") From GOBJET
    #Endif
    #If GREP <> "" | [M:SOH0]SOHCAT <> 3 | CLECUR = 0 | [M:SOH1]ORDSTA = 2 | [M:SOH1]APPFLG<3
    #   Call VIREBOUT(CHAINE,"3") From GOBJET
    #Endif
    #If GREP <> "" | CLECUR = 0 | [M:SOH1]DLVSTA > 1 | [M:SOH1]INVSTA > 1 | [M:SOH1]APPFLG<3 |
    #&  ([M:SOH1]BETFCY=2 & [M:SOH1]BETCPY<=1) | [M:SOH0]SOHCAT = 2 | [M:SOH3]PRFNUM <> ""
    #   Call VIREBOUT(CHAINE,"4") From GOBJET
    #Endif
    #If GREP<>"" | CLECUR=0 | [M:SOH1]ORDSTA=2 | [M:SOH2]ORDCLE=1 | WPREQTY<>0 |
    #&  ([M:SOH0]ORIFCY<>"" & [M:SOH0]ORIFCY<>[M:SOH0]SALFCY)
    #   Call VIREBOUT(CHAINE,"5") From GOBJET
    #Endif
    #If GREP <> "" | [M:SOH0]SOHCAT = 3  | CLECUR = 0 | [M:SOH1]ORDSTA = 2 | [M:SOH1]APPFLG<3 |
    #&  WPRE_STA = 0       : # 100013 : Une ligne sur liste de prépa peut âtre allouée mais pas préparée
    ##&  WALL_PRE_STA = 0  : # 100013
    ##&  sum([M:SOH4]LPRQTY,[M:SOH4]OPRQTY,[M:SOH4]PREQTY,[M:SOH4]ODLQTY,[M:SOH4]DLVQTY)>=sum([M:SOH4]QTY) : # Bug 76907
    #   Call VIREBOUT(CHAINE,"6") From GOBJET
    #Endif
    ## -------------------------------------------------------------------------------------- #
    ## Activation/Désactivation des menus                                                     #
    ## -------------------------------------------------------------------------------------- #
    ##   E,F : Texte              : Actif si commande en ligne ou création ou duplication     #
    ## H,J,K : Adresse            : Actif si commande en ligne ou création ou duplication     #
    ##     U : Info douanières    : Actif si devis en ligne                                   #
    ##   L,M : Contremarque       : Désactivé si aucune cde ou cde soldée                     #
    ##     R : Acomptes           : Actif si commande en ligne et rien en cours               #
    ##     T : Situation commande : Actif si commande en ligne et rien en cours               #
    ##     W : Transaction                                                                    #
    ##     V : Bouton bidon en C/S, permettant de valoriser une cde sur le site e_commerce    #
    ##     N : Traçabilité pièces                                          SEGAY 05/12/2008   #
    ##     O : Sage Sales Tax                                              RBU 26/04/2012     #
    ## -------------------------------------------------------------------------------------- #
    #If GREP="C" | GREP="D" | CLECUR
    #    CHMEN += "EF"
    #    CHMEN += "HJK"
    #Endif
    #If CLECUR CHMEN += "UP" Endif
    #If CLECUR & GREP="" & [M:SOH1]ORDSTA <> 2
    #    For I=0 To [M]NBLIG-1
    ##        If find([M]FMI(I),2,3) & [M]FMINUM(I) = ""                       : # Bug 82706
    #        If find([M]FMI(I),2,3) & [M]FMINUM(I) = "" & GFONC1 <> "GESPOH"   : # Bug 82706
    #            If !instr(0,CHMEN,"L") CHMEN += "L" Endif
    #        Endif
    #        If ([M]FMI(I) = 5) & [M]FMINUM(I) = ""
    #            If !instr(0,CHMEN,"M") CHMEN += "M" Endif
    #        Endif
    #    Next
    #Endif
    #If CLECUR & GREP = ""
    #    CHMEN += "RT"
    #Endif
    #CHMEN += "0"  # FGR 31/07/2014 : X3SUIVI101684 "W" devient "0"
    #If  func AFNC.ACTIV("LTA") & GLOCUSATAX : CHMEN += "O" : Endif
    #If dim(GWEBSERV)=1 & GWEBSERV=1 CHMEN += "V" : Endif
    #If !find(GREP,"C","D") and !find("CONSPIV",GNAVIG(1..GPILNAV)) Then CHMEN += "N" Endif # SEGAY 05/12/2008 : branchement traçabilité pièces
    #
    ## 78411 Sage Exchange
    #If CLECUR & GREP="" & func AFNC.ACTIV("SEPP") & func SEPPLIB.SEPP_DOC([M:SOH3]PTE) & [M:SOH1]CDTSTA<>4
    #  #If the payment method has Sage Exchange turned on - enable the menu
    #  If !instr(0,CHMEN,"S") : CHMEN += "S" : Endif
    #Endif
    #
    #Gosub SET_BOUT_SPE From GSAISIE
    #
    #Return
    
    # 76907
    ##############################################################################################
    #    Suppression des boutons                                                                 #
    #    Vérification des qtés préparées/livrées pour suppression boutons allocation/préparation #
    ##############################################################################################
    $SETB_VERIF_QTY
    Local Integer WI
    
    # 100013 : Une ligne sur liste de prépa peut âtre allouée mais pas préparée
    #WALL_PRE_STA=0 : # Par défaut, les boutons Allocation/Préparation sont inactifs
    WALL_STA=0 : # Par défaut, le bouton Allocation  est inactif
    WPRE_STA=0 : # Par défaut, le bouton Préparation est inactif
    # 100013
    
    # 107888 : Scheduled invoices : (LD:01/06/16)
    WLIV_STA=0 : # Par défaut, le bouton Livraison   est inactif
    # 107888 : Scheduled invoices : (LD:01/06/16)
    
    For WI=0 To [M]NBLIG-1
      #If [M:SOH4]STOMGTCOD(WI)>1 & [M:SOH4]SOQSTA(WI)<>3
    
     # 107888 : Scheduled invoices : (LD:19/05/16)
     # Seules les lignes livrables peuvent être allouées/préparées
      #If [M:SOH4]SOQSTA(WI)<>3
      If [M:SOH4]SOQSTA(WI)<>3 & [M:SOH4]DLVFLG(WI)=2
     # 107888 : Scheduled invoices : (LD:19/05/16)
    
    # 100013 : Une ligne sur liste de prépa peut âtre allouée mais pas préparée
    #    # Dès qu'on trouve une ligne qui est encore à allouer ou à préparer, on active les boutons
    #    If sum([M:SOH4]LPRQTY(WI),[M:SOH4]OPRQTY(WI),[M:SOH4]PREQTY(WI),[M:SOH4]ODLQTY(WI),[M:SOH4]DLVQTY(WI))<[M:SOH4]QTY(WI)
    #      WALL_PRE_STA=1 : Break
    #    Endif
        # Dès qu'on trouve une ligne qui est encore à allouer, on active le bouton
        If sum([M:SOH4]OPRQTY(WI),[M:SOH4]PREQTY(WI),[M:SOH4]ODLQTY(WI),[M:SOH4]DLVQTY(WI))<[M:SOH4]QTY(WI)
          WALL_STA=1
        Endif
        # Dès qu'on trouve une ligne qui est encore à préparée, on active le bouton
        If sum([M:SOH4]LPRQTY(WI),[M:SOH4]OPRQTY(WI),[M:SOH4]PREQTY(WI),[M:SOH4]ODLQTY(WI),[M:SOH4]DLVQTY(WI))<[M:SOH4]QTY(WI)
          WPRE_STA=1
        Endif
        # 107888 : Scheduled invoices : (LD:01/06/16)
        # Dès qu'on trouve une ligne qui est encore à livrer, on active le bouton
        If sum([M:SOH4]ODLQTY(WI),[M:SOH4]DLVQTY(WI))<[M:SOH4]QTY(WI)
          WLIV_STA=1
        Endif
        #If WALL_STA=1 & WPRE_STA=1 Break Endif
        If WALL_STA=1 & WPRE_STA=1 & WLIV_STA=1 Break Endif
        # 107888 : Scheduled invoices : (LD:01/06/16)
    # 100013
      Endif
    Next
    
    Return
    # 76907
    
    ###########################################################################################
    #    Avant l'execution des boutons et des menus                                           #
    ###########################################################################################
    $AVANTBOUT
    Local  Char     WFONC1(30), SYMBOLE2(50)
    #fq66051-gbn
    Local  Integer  SAV_GCONSULT : SAV_GCONSULT=GCONSULT
    Local  Integer  SAV_GCONSDIA : SAV_GCONSDIA=GCONSDIA
    
    GERR=0
    # Pour etre sur qu'il soit bien chargé
    GFCY=[M]SALFCY
    
    # Visu des textes si commande soldée
    # Visu des textes si aucun droit de modif : (Bug 39742)
    #If [M:SOH1]ORDSTA=2 | !ACTMOD GCONSDIA=1 Endif : # Bug 42904
    If [M:SOH1]ORDSTA=2 | (find(GREP,"C","D") & !ACTCRE) | (GREP="M" & !ACTMOD) GCONSDIA=2 Endif : # Bug 42904
    
      # FGR 19/05/2015 : X3SUIVI106158 (début)
      If find(BOUT, "E", "F", "H", "J", "K") Then
        If [M:SOH0]BPCORD = "" Then
          GERR = 1
          GMESSAGE = mess(427,192,1)
          Return
        Endif
      Endif
      # FGR 19/05/2015 : X3SUIVI106158 (fin)
    
    Case BOUT
        When "E"     :                             : # Texte entete ARC
                        If [M]SOHNUM = "" & GREP <> "C" & GREP <> "D"
    #                       GMESSAGE est à blc, il faut positionner ERR
                            GERR = 1 : GMESSAGE= "" : Return
                        Endif
        When "F"     :                             : # Texte pied ARC
                        If [M]SOHNUM = "" & GREP <> "C" & GREP <> "D"
    #                       GMESSAGE est à blc, il faut positionner ERR
                            GERR = 1 : GMESSAGE= "" : Return
                        Endif
        When "H"      : [M]CNTNAM=[M:ADB1]CNTNAM    : # Adresse commande
        When "J"      : [M]CNTNAM=[M:ADB3]CNTNAM    : # Adresse facture
    #                    If dim([M]EECNUM)>0
    #                       [M]EECNUM=[M:ADB3]EECNUM
    #                    Endif
        When "K"      : [M]CNTNAM=[M:ADB2]CNTNAM    : # Adresse livraison
        When "L"      : Local Char WFCY             : # Contremarque achat
                        Local Integer WRET
                        WFCY=GFCY
        When "M"      : Local Char WFCY             : # Contremarque production
                        Local Integer WRET
                        WFCY=GFCY
                        Gosub AVTBOUT_FMI
        When "1"      :                               # Allocation
    #                   Ctrl autorisation
                        GBIDC2="A": Gosub AUTORIS_OPT From CONTX3
                        If !GBIDI2 GERR = 1 : GMESSAGE = mess(2,104,1) : Return : Endif
                        Gosub RELIT From GOBJSUB                    : # Bug 66081
                        Gosub VERROU_SOH
        When "2"      :                               # Livraison
    #                   Ctrl autorisation
                        Local Shortint SVADXMXL      # FGR 24/04/2015 : X3SUIVI102508
    
                        SVADXMXL = adxmxl            # FGR 24/04/2015 : X3SUIVI102508 : on planque adxmxl avant d'aller dans les livraisons
                        GCREPARBOU = 2
                        GBIDC2="L": Gosub AUTORIS_OPT From CONTX3
                        If !GBIDI2 GERR = 1 : GMESSAGE = mess(2,104,1) : Return : Endif
                        WFONC1=GFONC1 : GFONC1="GESSOH"
                        Gosub AVTBOUT_LIV
                        If GERR <> 1
                           Gosub VERROU_SOH
                           If GERR <> 1 GCREPARBOU = 1 : Close Local File [TSO] : Endif
                        Endif
        When "3"      :                               # Facture
    #                   Ctrl autorisation
                        GCREPARBOU = 2
                        GBIDC2="F": Gosub AUTORIS_OPT From CONTX3
                        If !GBIDI2 GERR = 1 : GMESSAGE = mess(2,104,1) : Return : Endif
                        GINVTYP = 1 : WFONC1=GFONC1 : GFONC1="GESSOH"
                        Gosub AVTBOUT_FAC
                        If GERR <> 1
                           Gosub VERROU_SOH
                           If GERR <> 1 GCREPARBOU = 1 : Endif
                        Endif
                        # Issue X3-237574 - 2021-04-22 by SR : To know that we are coming from "Invoice" button for scheduled invoices
                        If [M:SOH0]SOHCAT =1 : Global Integer G111783C : G111783C = 2 : Endif
                        # End issue X3-237574
        When "4"      :                               # Proforma
    #                   Ctrl autorisation
                        GCREPARBOU = 2
                        GBIDC2="P": Gosub AUTORIS_OPT From CONTX3
                        If !GBIDI2 GERR = 1 : GMESSAGE = mess(2,104,1) : Return : Endif
    #                   Ctrl devise "in"
                        Local Char WDEVISE : Local Date WDAT : Local Integer WOK
                        WDEVISE=[M:SOH0]CUR:WDAT=[M:SOH0]ORDDAT
                        Gosub CTLDEVISEIN From CONTX3
                        Case WOK
                            When 1 :     # Attention saisie en devise "in"
                                OK=2 : Call AVERTIR(mess(95,107,1),OK) From GESECRAN
                                If OK=1 OK=0 : GCREPARBOU=2 : GERR=1 : Return : Endif
                            When 2 :     # La devise est "in" interdite
                                GCREPARBOU=2:GERR=1 : GMESSAGE = mess(94,107,1) : Return
                            When 3 :     # La devise est "in" et disparue
                                GMESSAGE=[M:SOH0]CUR-":"-mess(457,196,1)-format$("D:"+GFMDAT4,[F:TCU]CURENDDAT)
                                GCREPARBOU=2:GERR=1 : Return
                        Endcase
                        Default File [SOH]
                        GINVTYP = 5 : WFONC1=GFONC1 : GFONC1="GESSOH"
                        Gosub AVTBOUT_PRO
                        If GERR <> 1
                           Gosub VERROU_SOH
                           If GERR <> 1 GCREPARBOU = 1 : Endif
                        Endif
        When "5"      :                        : # Solde
    #                   Pas de solde si la commande est allouée
    #                   (Si utilisation bt.allocation manuelle sur nblig on est pas repassé par setbout)
    #                    If [M:SOH1]ALLSTA <> 1 GERR=1 : GMESSAGE=mess(15,192,1) : Return : Endif
    #                   Ctrl autorisation bouton solde (on teste la modification)
                        GBIDC2="D": Gosub AUTORIS_OPT From CONTX3
                        If !GBIDI2  GERR = 1 : GMESSAGE = mess(2,104,1) : Return : Endif
                        Read [SOH] SOH0=[M:SOH0]SOHNUM : If fstat  Raz [F:SOH] : Endif            : # Bug 66081
                        If [F:SOH]ORDSTA=2 GMESSAGE=mess(55,194,1) : GERR=1 : OK=0 : Return Endif : # Bug 66081
    
                        # 200515 : Progress billing / X3-201751 : Control on sales order lines associated to a billing plan when the line is closed - 2020-07-20 by LD
                        # Close possible only if there is no scheduled invoices linked to a billing situation not invoiced
                        # Issue X3-200515/227027 - 2020-12-18 by MUARN : general tour without PJM
                        If dim([M:SOH4]PRGBILNUM) > 0
                        # End issue X3-200515/227027
                          If func LIBSAL_INVCND_SOH.VERF_SVICD_PRGBILINV([M:SOH0]SOHNUM, 0, 0, GMESSAGE) = [V]CST_AERROR
                            GERR=1 : OK=0 : Return
                          Endif
                          # 200515 : Progress billing / X3-201751 : Control on sales order lines associated to a billing plan when the line is closed - 2020-07-20 by LD
                        # Issue X3-200515/227027 - 2020-12-18 by MUARN : general tour without PJM
                        Endif
                        # End issue X3-200515/227027
                        # -------------------------------------
                        # FGR 29/04/2013 : X3SUIVI89648 (début)
                        If GMODU(12) = G_YES Then
                          Local Char SSREMSG(type(GMESSAGE)-10)
    
                          Call VERIF_SRE_COV([M:SOH0]SOHNUM, SSREMSG) From SUBSREB3
                          If SSREMSG <> "" Then
                            GERR = 1
                            GMESSAGE = SSREMSG
                            OK = 0
                            Return
                          Endif
                        Endif
                        # FGR 29/04/2013 : X3SUIVI89648 (fin)
                        # -------------------------------------
                        If sum([M:SOH4]ALLQTYSTU) | sum([M:SOH4]SHTQTYSTU)
                            OK=2 : Call OUINON(mess(140,191,1)-"\"-mess(205,100,1),OK) From GESECRAN
                            If OK=1 : OK=0 : GERR=1 : Return : Endif
                        Elsif sum([M:SOH4]FMINUM) <> "" : # Avertir si au moins 1 ligne à contremarque
                            OK=1 : Call AVERTIR(mess(53,191,1),OK) From GESECRAN
                            If OK=1 : OK=0 : Return : Endif
                        Else
                            #----- Commande soldée et acomptes actifs, il convient de les supprimer -----#
                            Call VERF_ACOMPTE_ACTIF(5,[M:SOH0]SOHNUM,OK) From TRTTPT
                            If OK=0
                                OK=2 : Call OUINON(mess(554,199,1)+"\"+mess(205,100,1),OK) From GESECRAN
                                If OK=1  OK=0 : Return : Endif
                            Else
                                # Demande de confirmation de solde
                                OK=1 : Call AVERTIR(mess(117,191,1),OK) From GESECRAN
                                If OK=1 : OK=0 : GERR=1 : Return : Endif
                            Endif
                        Endif
                        If func PORLEGLIB.PORLEG([M:SOH0]SALFCY,"")=1 & [M:SOH1]SOHCFMFLG <> 2 : GMESSAGE=mess(38,7711,1) : OK=0 : GERR=1 : Return : Endif
                        OK=1
                        Gosub VERROU_SOH
        When "6"      :                               # Préparation
    #                   Ctrl autorisation
                        GCREPARBOU = 2
                        GBIDC2="R": Gosub AUTORIS_OPT From CONTX3
                        If !GBIDI2 GERR = 1 : GMESSAGE = mess(2,104,1) : Return : Endif
                        WFONC1=GFONC1 : GFONC1="GESSOH"
                        Gosub AVTBOUT_PRE
                        If GERR <> 1
                           Gosub VERROU_SOH
                           If GERR <> 1 GCREPARBOU = 1 : Endif
                        Endif
        When Default
    Endcase
    
    #Fq66051-Gbn
    Case BOUT
     When "E", "F", "H", "J", "K", "U" : If GREP="" & (!ACTMOD | !VERROU)  GCONSULT=1 : GCONSDIA=2  : Endif
     When Default
    Endcase
    
    Return
    ###########################################################################################
    ###########################################################################################
    #    Avant execution du bouton contremarque production                                    #
    #    Si les lignes n'ont pas toutes le même site d'expé.                                  #
    #    --> on le passe à blanc en param. et il faudra le saisir dans la fenêtre de sélection#
    ###########################################################################################
    $AVTBOUT_FMI
    Local Integer WI
    Local Char    WFMI_STOFCY(GLONFCY)
    
    If sigma(WI=0,[M]NBLIG-1,[M:SOH4]DSTOFCY(WI)=[M:SOH2]STOFCY)=[M]NBLIG WFMI_STOFCY=[M:SOH2]STOFCY:Return:Endif
    
    For WI=0 To [M]NBLIG-1
        If [M]FMI(WI)=5 & [M]FMINUM(WI)=""
            If WFMI_STOFCY="" WFMI_STOFCY=[M]DSTOFCY(WI) Endif
            If [M]DSTOFCY(WI)<>WFMI_STOFCY Raz WFMI_STOFCY : Break Endif
        Endif
    Next
    
    Return
    
    ###########################################################################################
    # $CTL_DEPASS_ENCOURS                                                                     #
    ###########################################################################################
    $CTL_DEPASS_ENCOURS
      # FGR 10/03/2015 : X3SUIVI23273
      If !([M:SOH1]BETFCY = 2 & [M:SOH1]BETCPY <> 2) or GCTLBETFCY = 2 Then
        #- Si pas (Intersit & non intersoc) ou si Ctrl intersit encours&prix
        GMESSAGE = mess(29,192,1)
        #-- 81855
        If dim(GVENFLG02) >= 0 & (GVENFLG02 =2  or GVENFLG02 = 3) Then
          GMESSAGE += WMESS9
        Endif
        # Si déblocage crédit non autorisé on bloque
        If GCDTUNL = 1 Then
          GERR = 1
          Return
        Else
          Call AVERTIR(GMESSAGE,OK) From GESECRAN
          Raz GMESSAGE
          If OK = 1 Then
            OK = 0
            GERR = 1
            Return
          Endif
        Endif
      Endif
    Return
    ###########################################################################################
    #    Avant execution du bouton facture                                                    #
    ###########################################################################################
    $AVTBOUT_FAC
    
    Local Integer I, WLIG, CDTSTA
    Local Decimal WALLQTY
    Local Integer WNBLCTM
    Local Char    WBPAADD
    Local Integer LRET                               # FGR 21/04/2015 : X3SUIVI105605
    Local Char SVMESSAGE(type(GMESSAGE)-10)          # FGR 21/04/2015 : X3SUIVI105605
    
    #--- Issue X3-138438
    Gosub REFRESH_SORDER
    ## Bug 66081
    #Read [SOH] SOH0=[M:SOH0]SOHNUM : If fstat  Raz [F:SOH] : Endif
    #--- End issue X3-138438
    
    If [F:SOH]ORDSTA=2 GMESSAGE=mess(55,194,1) : GERR=1 : OK=0 : Return Endif
    # Bug 66081
    
    If [F:SOH]HLDSTA>1 : GERR=1 : GMESSAGE = mess(16,492,1) : Return : Endif  # order holds
    
    Raz GERR, GMESSAGE
    
    # V6.2 : Certification
    # Si ctrl date documents : La commande doit avoir une date <= datesyst (La facture est générée avec datesyst)
    If GCTLDATORI=2 & [F:SOH]ORDDAT>datesyst
      GMESSAGE=mess(2,413,1)-[F:SOH]SOHNUM-format$(GFMDAT,[F:SOH]ORDDAT)-":\"-mess(347,192,1)-":"-format$(GFMDAT,datesyst) :#--CPO 83985 GFMDAT au lieu de GFMD
      GERR=1 : Return
    Endif
    # Bug 69179 : Ctrl reporté dans GEN_FAC (nécessite [M]GTE)
    ## V6.2 : Certification
    ## Contrôle date pour certification NF
    #Call CTLDAT_CNF(5,[M]SALFCY,[0/0/0],datesyst,"","") From CONTX3
    #If mkstat  GERR=1 : GMESSAGE-=":"-format$(GFMD,datesyst) : Return Endif
    # Bug 69179
    
    # Contrôle état crédit de la commande
    Call SDCDTSTA ([M:SOH0]SOHNUM,[M:SOH0]BPCORD,[M:SOH0]CHGTYP,0,"",[M:SOH0]ORDDAT,[M:SOH2]UNL, 2,CDTSTA,GBIDD1,GBIDD1)
    &    From TRTVENCDT
    
    Gosub RECOVERED_AUPDTICK # Issue 107888 - 2016-03-21 by CPO : Scheduled invoices object management
    
    Case CDTSTA
     When 2 : # Client bloqué
              GERR=1 : GMESSAGE = mess(52,192,1) : Return
     When 3 : # Dépassement d'en cours
              # FGR 10/03/2015 : X3SUIVI23273 (début)
              GMESSAGE = mess(29,192,1)
              # Si déblocage crédit non autorisé on bloque
              #If GCDTUNL=1
              #   GERR=1 : Return
              #Else
              #   Call AVERTIR(GMESSAGE,OK) From GESECRAN
              #   Raz GMESSAGE
              #   If OK=1 OK=0 : GERR=1 : Return : Endif
              #Endif
              Gosub CTL_DEPASS_ENCOURS
              If GERR = 1 Then
                Return
              Endif
              # FGR 10/03/2015 : X3SUIVI23273 (fin)
     When 4 : If GLOKORD = 2 : # Acomptes non versés
                 GERR=1 : GMESSAGE = mess(53,192,1) : Return
              Endif
     When 5 : # 78411 Sage Exchange
              Local Char VCRNUM
              Local Integer VCRTYP
              Call SEPP_CUR_DOC([F:SOH]SOHNUM,[L]VCRTYP,[L]VCRNUM) From SEPPCDT
              If [L]VCRNUM<>[F:SOH]SOHNUM
                If [L]VCRTYP=4
                  GMESSAGE = func AFNC.MES1(mess(52,2092,1),mess(54,198,1)-[L]VCRNUM)
                Else
                  GMESSAGE = func AFNC.MES1(mess(52,2092,1),mess(55,198,1)-[L]VCRNUM)
                Endif
              Else
                GMESSAGE = mess(9,2092,1)
              Endif
              GERR=1 : Return
    When Default
    Endcase
    
    # Si facturation cde soldée et cde non allouée totalement
    If [M:SOH3]IME=2 & [M:SOH1]ALLSTA<>3 & [M:SOH0]ALLLINNBR<>0 & sum([M:SOH4]STOMGTCOD) <> [M:SOH4]NBLIG
       Call AVERTIR(mess(139,192,1),OK) From GESECRAN
       Raz GMESSAGE
       If OK=1 OK=0 : GERR=1 : Return : Endif
    Endif
    
    OK = 2
    Raz WLIG
    # On se sert de la variable ligne [M]GRPFLG(I) pour dire que la ligne est à facturer
    
    For I=0 To [M:SOH4]NBLIG-1
       [M:SOH4]GRPFLG(I) = 1
       WALLQTY = [M:SOH4]ALLQTY(I)
    
       # Si composant de kit/sous-traité, la ligne sera traitée avec le composé
       If find([M:SOH4]LINTYP(I),3,4,5,11,12,13) Goto NEXT_LIG1 Endif
    
       If [M:SOH4]SOQSTA(I) <> 3 & [M:SOH4]DEMSTA(I) = 1
    
          If WLIG> 0 & [M:SOH4]DBPAADD(I) <> WBPAADD & [M:SOH3]IME=4
             # Les clients livrés sont différents à la ligne
             GERR=1 : GMESSAGE = mess(314,192,1) : OK = 1 : Break
          Endif
    
          If WALLQTY=0 & [M:SOH4]SHTQTY(I)<>0
             If GSHTDLV < 2
                If GERR=2 GMESSAGE+=" \ " Endif
                GERR=2 :  GMESSAGE+=[M:SOH0]SOHNUM-[M:SOH4]ITMREF(I)-format$(GFMDAT,[M:SOH4]DSHIDAT(I))
    &                               +"\"+mess(183,192,1) :#--CPO 83985 GFMDAT au lieu de GFMD
                Goto NEXT_LIG1
             Else
                If [F:ITM]ITMREF <> [M:SOH4]ITMREF(I)
                   Read [ITM]ITM0=[M:SOH4]ITMREF(I)
                   If fstat Raz [F:ITM] Endif
                Endif
                If GSHTDLV=2 & [F:ITM]NEGSTO<>2
                   If GERR=2 GMESSAGE+=" \ " Endif
                   GERR=2 :  GMESSAGE+=[M:SOH0]SOHNUM-[M:SOH4]ITMREF(I)-format$(GFMDAT,[M:SOH4]DSHIDAT(I))
    &                                  +"\"+mess(184,192,1) :#--CPO 83985 GFMDAT au lieu de GFMD
                   Goto NEXT_LIG1
                Endif
             Endif
          Endif
    
          # Ligne gérée en contremarque et commande d'achat non générée
          If [M:SOH4]FMI(I) > 1 & [M:SOH4]FMI(I) < 4 & [M:SOH4]FMINUM(I) = ""
             If [M:SOH4]ALLQTY(I)=0
                 # Il n'y a rien d'alloué : On bloque la livraison
                 If GERR=2 GMESSAGE+=" \ " Endif
                 GERR=2 :  GMESSAGE+=[M:SOH0]SOHNUM-[M:SOH4]ITMREF(I)-format$(GFMDAT,[M:SOH4]DSHIDAT(I))
    &                            +"\"+mess(111,192,1) :#--CPO 83985 GFMDAT au lieu de GFMD
                 Goto NEXT_LIG1
             Else
                # Il y a des allocations : Elles ont été genérées manuellement : On demande si on veut livrer
                If WNBLCTM = 0
                   Call OUINON(mess(160,197,1)+"\"+mess(112,191,1),OK) From GESECRAN
                   If OK=1
                       WNBLCTM=9999
                       Goto NEXT_LIG1
                   Else
                       WNBLCTM+=1
                   Endif
                Elsif WNBLCTM=9999
                   Goto NEXT_LIG1
                Endif
             Endif
          Endif
          # Ligne gérée avec contremarque receptionnée et pas de quantité allouée
          If [M:SOH4]FMI(I)=3 & [M:SOH4]ALLQTY(I)=0 & [M:SOH4]STOMGTCOD(I)>1
             If WNBLCTM = 0
                Call OUINON(mess(140,192,1)+"\"+mess(112,191,1),OK) From GESECRAN
                If OK=1
                   WNBLCTM=9999
                   Goto NEXT_LIG1
                Else
                   WNBLCTM+=1
                Endif
             Elsif WNBLCTM=9999
                Goto NEXT_LIG1
             Endif
          Endif
          # Ligne gérée avec un ordre de production et OF non généré
          If [M:SOH4]FMI(I) = 5 & [M:SOH4]FMINUM(I) = ""
             If [M:SOH4]ALLQTY(I)=0
                 # Il n'y a rien d'alloué : On bloque la livraison
                If GERR=2 GMESSAGE+=" \ " Endif
                GERR=2 :  GMESSAGE+=[M:SOH0]SOHNUM-[M:SOH4]ITMREF(I)-format$(GFMDAT,[M:SOH4]DSHIDAT(I))
    &                                +"\"+mess(138,192,1) :#--CPO 83985 GFMDAT au lieu de GFMD
                Goto NEXT_LIG1
             Else
                # Il y a des allocations : Elles ont été genérées manuellement : On demande si on veut livrer
                If WNBLCTM = 0
                   Call OUINON(mess(201,197,1)+"\"+mess(112,191,1),OK) From GESECRAN
                   If OK=1
                       WNBLCTM=9999
                       Goto NEXT_LIG1
                   Else
                       WNBLCTM+=1
                   Endif
                Elsif WNBLCTM=9999
                   Goto NEXT_LIG1
                Endif
             Endif
          Endif
          # Ligne gérée avec un ordre de production  et pas de quantité allouée
          If [M:SOH4]FMI(I)=5 & [M:SOH4]ALLQTY(I)=0
             If WNBLCTM = 0
                Call OUINON(mess(140,192,1)+"\"+mess(112,191,1),OK) From GESECRAN
                If OK=1
                   WNBLCTM=9999
                   Goto NEXT_LIG1
                Else
                   WNBLCTM+=1
                Endif
             Elsif WNBLCTM=9999
                Goto NEXT_LIG1
             Endif
          Endif
    
          # Pas de facturation d'une ligne de commande d'un contrat de service
          If [M:SOH4]CONNUM(I) <> ""
             Goto NEXT_LIG1
          Endif
    
          # Pour contrôle site expé et adresse de livraison différents
          If WLIG=0 WBPAADD=[M:SOH4]DBPAADD(I) :Endif
    
          # --------------------------------------
          # FGR 21/04/2015 : X3SUIVI105605 (début) : seulement pour les factures
          #If [M:SIH0]INVTYP = 1 Then
            If dim([M:SOH4]ECCVALMAJ) >= 0 Then
              SVMESSAGE = GMESSAGE
              Call CTLECCVAL([M:SOH4]ECCVALMAJ(I), [M:SOH4]DSTOFCY(I), [M:SOH4]ITMREF(I), 4, "", date$, LRET) From STKSOR
              If LRET >= 1 Then
                GMESSAGE = SVMESSAGE - "\" - mess(3,40,1) - num$(I+1) - ":" - GMESSAGE - "(" + [M:SOH4]ECCVALMAJ(I) + ")"
                WNBLCTM=9999
                Goto NEXT_LIG1
              Endif
            Endif
            #
            If dim([M:SOH4]ECCVALMIN) >= 0 Then
              SVMESSAGE = GMESSAGE
              Call STKCTRECC([M:SOH4]ITMREF(I), [M:SOH4]ECCVALMAJ(I), [M:SOH4]ECCVALMIN(I), "", 4) From STKACT
              If mkstat Then
                GMESSAGE = SVMESSAGE - "\" - mess(3,40,1) - num$(I+1) - ":" - GMESSAGE - "(" + [M:SOH4]ECCVALMIN(I) + ")"
                WNBLCTM=9999
                Goto NEXT_LIG1
              Endif
            Endif
          #Endif
          # FGR 21/04/2015 : X3SUIVI105605 (fin)
          # --------------------------------------
    
          [M:SOH4]GRPFLG(I) = 2
          WLIG += 1
       Endif
    $NEXT_LIG1
    
    # point d'entrée pour modifier la sélection des lignes à facturer
    GPOINT="SOHINVLIG" : Gosub ENTREE From EXEFNC
    
    Next I
    
    #If OK = 1 Return Endif
    # Il n'y a rien à facturer
    If WLIG = 0
       GERR = 1 : GMESSAGE += "\"+mess(78,192,1)
       OK = 1
       Return
    Endif
    
    Return
    
    ###########################################################################################
    #    Avant execution du bouton proforma                                                   #
    ###########################################################################################
    $AVTBOUT_PRO
    
    Local Integer I, WLIG
    
    #--- Issue X3-138438
    Gosub REFRESH_SORDER
    ## Bug 66081
    #Read [SOH] SOH0=[M:SOH0]SOHNUM : If fstat  Raz [F:SOH] : Endif
    #--- End issue X3-138438
    
    If [F:SOH]PRFNUM<>"" GMESSAGE=mess(106,191,1)-[F:SOH]PRFNUM : GERR=1 : OK=0 : Return Endif
    # Bug 66081
    
    If [F:SOH]HLDSTA>1 : GERR=1 : GMESSAGE = mess(17,492,1) : Return : Endif  # order holds
    
    Raz GERR, GMESSAGE
    
    OK = 2
    Raz WLIG
    # On se sert de la variable ligne [M]GRPFLG(I) pour dire que la ligne est à facturer
    
    For I=0 To [M:SOH4]NBLIG-1
       [M:SOH4]GRPFLG(I) = 1
       If [M:SOH4]SOQSTA(I) <> 3
          [M:SOH4]GRPFLG(I) = 2
          WLIG += 1
       Endif
    
    $NEXT_LIG2
    # point d'entrée pour modifier la sélection des lignes à facturer
    GPOINT="SOHINVLIG" : Gosub ENTREE From EXEFNC
    Next I
    
    # Il n'y a rien à facturer
    If WLIG = 0
       GERR = 1 : GMESSAGE += "\"+mess(78,192,1)
       OK = 1
       Return
    Endif
    
    Return
    ###########################################################################################
    #    Avant execution du bouton livraison                                                  #
    ###########################################################################################
    $AVTBOUT_LIV
    Local Integer I, WLIG, CDTSTA
    Local Decimal WALLQTY
    
    Local Integer WNBLLIV, WNBLCTM, WNBLMDL
    Local Char    WBPTNUM(GLONBPT), WMDL, WSTOFCY(GLONFCY), WBPAADD
    
    #--- Issue X3-138438
    Gosub REFRESH_SORDER
    ## Bug 66081
    #Read [SOH] SOH0=[M:SOH0]SOHNUM : If fstat  Raz [F:SOH] : Endif
    #--- End issue X3-138438
    
    If [F:SOH]ORDSTA=2 GMESSAGE=mess(55,194,1) : GERR=1 : OK=0 : Return Endif
    # Bug 66081
    
    # Récupération des paramètres stock(livraison) du site / de la société
    Call GLOBSTOFCY([M:SOH2]STOFCY) From TRTVENGLOB
    
    Raz GERR,GMESSAGE
    
    # Contrôle état crédit de la commande
    Call SDCDTSTA ([M:SOH0]SOHNUM,[M:SOH0]BPCORD,[M:SOH0]CHGTYP,0,"",[M:SOH0]ORDDAT,[M:SOH2]UNL,2,CDTSTA,GBIDD1,GBIDD1)
    &    From TRTVENCDT
    
    Gosub RECOVERED_AUPDTICK # Issue 107888 - 2016-03-21 by CPO : Scheduled invoices object management
    
    OK = 2
    Case CDTSTA
     When 2 : # Client bloqué
              GERR=1 : GMESSAGE = mess(52,192,1) : Return
     When 3 : # Dépassement d'en cours
              # FGR 10/03/2015 : X3SUIVI23273 (début)
              #GMESSAGE = mess(29,192,1)
              ## Si déblocage crédit non autorisé on bloque
              #If GCDTUNL=1
              #   GERR=1 : Return
              #Else
              #   Call AVERTIR(GMESSAGE,OK) From GESECRAN
              #   Raz GMESSAGE
              #   If OK=1 OK=0 : GERR=1 : Return : Endif
              #Endif
              Gosub CTL_DEPASS_ENCOURS
              If GERR = 1 Then
                Return
              Endif
              # FGR 10/03/2015 : X3SUIVI23273 (fin)
     When 4 : If GLOKORD = 2 : # Acomptes non versés
                 GERR=1 : GMESSAGE = mess(53,192,1) : Return
              Endif
     When 5 : # 78411 Sage Exchange
              Local Char VCRNUM
              Local Integer VCRTYP
              Call SEPP_CUR_DOC([F:SOH]SOHNUM,[L]VCRTYP,[L]VCRNUM) From SEPPCDT
              If [L]VCRNUM<>[F:SOH]SOHNUM
                If [L]VCRTYP=4
                  GMESSAGE = func AFNC.MES1(mess(52,2092,1),mess(54,198,1)-[L]VCRNUM)
                Else
                  GMESSAGE = func AFNC.MES1(mess(52,2092,1),mess(55,198,1)-[L]VCRNUM)
                Endif
              Else
                GMESSAGE = mess(9,2092,1)
              Endif
              GERR=1 : Return
     When Default
    Endcase
    
    #--- Bug 74688
    # Si livraison cde complète et cde non allouée totalement
    #If [M:SOH2]DME=3 & [M:SOH1]ALLSTA<>3 & [M:SOH0]ALLLINNBR<>0 & sum([M:SOH4]STOMGTCOD) <> [M:SOH4]NBLIG
    #   Call AVERTIR(mess(295,192,1),OK) From GESECRAN
    #   If OK=1 OK=0 : GERR=1 : Return : Endif
    #Endif
    #---
    
    If [F:SOH]HLDSTA>1 : GERR=1 : GMESSAGE = mess(15,492,1) : Return : Endif  # order holds
    
    Raz WLIG
    
    # On se sert de la variable ligne [M]GRPFLG(I) pour dire que la ligne est à livrer
    For I=0 To [M:SOH4]NBLIG-1
       [M:SOH4]GRPFLG(I) = 1
       WALLQTY = [M:SOH4]ALLQTY(I)
        #--- Issue 112531 by TS
       If [M:SOH4]DLVFLG(I)<>2 Goto NEXT_LIG Endif
       #---
       # Si composant de kit/sous-traité, la ligne sera traitée avec le composé
       If find([M:SOH4]LINTYP(I),3,4,5,11,12,13) Goto NEXT_LIG Endif
    
       If [M:SOH4]SOQSTA(I) <> 3 & [M:SOH4]DEMSTA(I) = 1
          If WLIG> 0 & [M:SOH4]DSTOFCY(I) <> WSTOFCY
             # Les sites expédition sont différents à la ligne
             GERR=1 : GMESSAGE = mess(61,192,1) : OK = 1 : Break
          Endif
          If WLIG> 0 & [M:SOH4]DBPAADD(I) <> WBPAADD
             # Les clients livrés sont différents à la ligne
             GERR=1 : GMESSAGE = mess(166,192,1) : OK = 1 : Break
          Endif
    
          # Cette ligne est en préparation
          If sum([M:SOH4]LPRQTY(I),[M:SOH4]OPRQTY(I),[M:SOH4]PREQTY(I))<>0
             GERR=2 : GMESSAGE = [F:SOQ]SOHNUM-":"-mess(27,159,1)-[F:SOQ]ITMREF-":"-mess(309,192,1)
             Goto NEXT_LIG
          Endif
    
          # Si article géré en stock
          If [M:SOH4]STOMGTCOD(I) <> 1
    
             # Si livraison ligne cde complète et ligne cde non allouée totalement
             #--- Bug 74688
             #If [M:SOH2]DME=2 & [M:SOH4]ALLQTY(I) <> 0 &
             If [M:SOH2]DME>1 & [M:SOH4]ALLQTY(I) <> 0 &
    &          ([M:SOH4]TALLQTY(I)+[M:SOH4]SHTQTY(I) < [M:SOH4]QTY(I))
                If WNBLLIV = 0
                   #--- Bug 74688
                   #Call OUINON(mess(296,192,1)+"\"+mess(112,191,1),OK) From GESECRAN
                   If [M:SOH2]DME = 2
                      Call OUINON(mess(296,192,1)+"\"+mess(112,191,1),OK) From GESECRAN
                   Else
                      Call OUINON(mess(353,192,1)+"\"+mess(112,191,1),OK) From GESECRAN
                   Endif
                   #---
                   If OK=1
                      WNBLLIV=9999
                      Goto NEXT_LIG
                   Else
                      WNBLLIV+=1
                   Endif
                Elsif WNBLLIV=9999
                   Goto NEXT_LIG
                Endif
             Endif
          # Si article non géré en stock
          Else
             # Si livraison cde ou ligne cde complète et qte à livrer saisie < reste à livrer
             If [M:SOH2]DME > 1 & [M:SOH4]TDLQTY(I) <> 0 &
    &        ([M:SOH4]TDLQTY(I)+[M:SOH4]LPRQTY(I)+[M:SOH4]OPRQTY(I)+[M:SOH4]PREQTY(I)+[M:SOH4]ODLQTY(I)+[M:SOH4]DLVQTY(I)<[M:SOH4]QTY(I))
                If WNBLLIV = 0
                   If [M:SOH2]DME = 2
                      Call OUINON(mess(212,192,1),OK) From GESECRAN
                   Else
                      Call OUINON(mess(213,192,1),OK) From GESECRAN
                   Endif
                   If OK=1
                      WNBLLIV=9999
                      Goto NEXT_LIG
                   Else
                      WNBLLIV+=1
                   Endif
                Elsif WNBLLIV=9999
                   Goto NEXT_LIG
                Endif
             Endif
          Endif
    
          If WALLQTY=0 & [M:SOH4]SHTQTY(I)<>0
             If GSHTDLV < 2
                If GERR=2 GMESSAGE+=" \ " Endif
                GERR=2 : GMESSAGE+=[M:SOH4]ITMREF(I)-format$(GFMDAT,[M:SOH4]DSHIDAT(I)) :#--CPO 83985 GFMDAT au lieu de GFMD
                         If !find([M]LINTYP(I),1,2,6,10) GMESSAGE -=":"-mess([M]LINTYP(I), 423,1) Endif
                         GMESSAGE+="\"+mess(183,192,1)
                Goto NEXT_LIG
             Else
                If [F:ITM]ITMREF <> [M:SOH4]ITMREF(I)
                   Read [ITM]ITM0=[M:SOH4]ITMREF(I)
                   If fstat Raz [F:ITM] Endif
                Endif
                If GSHTDLV=2 & [F:ITM]NEGSTO<>2
                   If GERR=2 GMESSAGE+=" \ " Endif
                   GERR=2 :  GMESSAGE+=[M:SOH4]ITMREF(I)-format$(GFMDAT,[M:SOH4]DSHIDAT(I)) :#--CPO 83985 GFMDAT au lieu de GFMD
                              If !find([M]LINTYP(I),1,2,6,10) GMESSAGE -=":"-mess([M]LINTYP(I), 423,1) Endif
                              GMESSAGE+="\"+mess(184,192,1)
                   Goto NEXT_LIG
                Endif
             Endif
          Endif
    
          # Ligne gérée en contremarque et commande d'achat non générée
          If [M:SOH4]FMI(I) > 1 & [M:SOH4]FMI(I) < 4 & [M:SOH4]FMINUM(I) = ""
             If [M:SOH4]ALLQTY(I)=0
                 # Il n'y a rien d'alloué : On bloque la livraison
                 If GERR=2 GMESSAGE+=" \ " Endif
                 GERR=2 :  GMESSAGE+=[M:SOH4]ITMREF(I)-format$(GFMDAT,[M:SOH4]DSHIDAT(I)) :#--CPO 83985 GFMDAT au lieu de GFMD
                           If !find([M]LINTYP(I),1,2,6,10) GMESSAGE -=":"-mess([M]LINTYP(I), 423,1) Endif
                           GMESSAGE+="\"+mess(111,192,1)
                 Goto NEXT_LIG
             Else
                # Il y a des allocations : Elles ont été genérées manuellement : On demande si on veut livrer
                If WNBLCTM = 0
                   Call OUINON(mess(160,197,1)+"\"+mess(112,191,1),OK) From GESECRAN
                   If OK=1
                       WNBLCTM=9999
                       Goto NEXT_LIG
                   Else
                       WNBLCTM+=1
                   Endif
                Elsif WNBLCTM=9999
                   Goto NEXT_LIG
                Endif
             Endif
          Endif
          # Ligne gérée avec contremarque receptionnée et pas de quantité allouée
          If [M:SOH4]FMI(I)=3 & [M:SOH4]ALLQTY(I)=0 & [M:SOH4]STOMGTCOD(I)>1
             If WNBLCTM = 0
                Call OUINON(mess(140,192,1)+"\"+mess(112,191,1),OK) From GESECRAN
                If OK=1
                   WNBLCTM=9999
                   Goto NEXT_LIG
                Else
                   WNBLCTM+=1
                Endif
             Elsif WNBLCTM=9999
                Goto NEXT_LIG
             Endif
          Endif
          # Ligne gérée avec un ordre de production et OF non généré
          If [M:SOH4]FMI(I) = 5 & [M:SOH4]FMINUM(I) = ""
             If [M:SOH4]ALLQTY(I)=0
                # Il n'y a rien d'alloué : On bloque la livraison
                If GERR=2 GMESSAGE+=" \ " Endif
                GERR=2 :  GMESSAGE+=[M:SOH4]ITMREF(I)-format$(GFMDAT,[M:SOH4]DSHIDAT(I)) :#--CPO 83985 GFMDAT au lieu de GFMD
                If !find([M]LINTYP(I),1,2,6,10) GMESSAGE -=":"-mess([M]LINTYP(I), 423,1) Endif
                GMESSAGE+="\"+mess(138,192,1)
    
                Goto NEXT_LIG
             Else
                # Il y a des allocations : Elles ont été genérées manuellement : On demande si on veut livrer
                If WNBLCTM = 0
                   Call OUINON(mess(201,197,1)+"\"+mess(112,191,1),OK) From GESECRAN
                   If OK=1
                       WNBLCTM=9999
                       Goto NEXT_LIG
                   Else
                       WNBLCTM+=1
                   Endif
                Elsif WNBLCTM=9999
                   Goto NEXT_LIG
                Endif
             Endif
          Endif
          # Ligne gérée avec un ordre de production  et pas de quantité allouée
          If [M:SOH4]FMI(I)=5 & [M:SOH4]ALLQTY(I)=0
             If WNBLCTM = 0
                Call OUINON(mess(140,192,1)+"\"+mess(112,191,1),OK) From GESECRAN
                If OK=1
                   WNBLCTM=9999
                   Goto NEXT_LIG
                Else
                   WNBLCTM+=1
                Endif
             Elsif WNBLCTM=9999
                Goto NEXT_LIG
             Endif
          Endif
          If WLIG=0
              # Si la ligne est livrable on vérifie que transporteur et mode de livraison sont homogènes
              WBPTNUM=[M:SOH4]DBPTNUM(I)
              WMDL   =[M:SOH4]DMDL(I)
              # Pour contrôle site expé et adresse de livraison différents
              WSTOFCY=[M:SOH4]DSTOFCY(I)
              WBPAADD=[M:SOH4]DBPAADD(I)
          Elsif (WBPTNUM<>[M:SOH4]DBPTNUM(I) & [M:SOH4]DBPTNUM(I)<>"") | (WMDL<>[M:SOH4]DMDL(I) & [M:SOH4]DMDL(I)<>"")
              If WNBLMDL = 0
                  OK=2
                  Call OUINON(mess(133,191,1)+"\"+mess(205,100,1)+"\"+mess(134,191,1),OK) From GESECRAN
                  If OK=1
                      OK=0 : GERR=1 : Break
                  Else
                      WNBLMDL+=1
                  Endif
              Endif
          Endif
          [M:SOH4]GRPFLG(I) = 2
          WLIG += 1
       Endif
    $NEXT_LIG
    Next I
    
    # Il n'y a rien à livrer
    If WLIG = 0
       GERR=1 : GMESSAGE += "\"+mess(62,192,1)
       OK = 1 : Return
    Endif
    Return
    ###########################################################################################
    #    Avant execution du bouton préparation                                                #
    ###########################################################################################
    $AVTBOUT_PRE
    Local Integer I, WLIG, CDTSTA
    Local Decimal WALLQTY
    Local Integer WNBLLIV, WNBLCTM, WNBLMDL
    Local Char    WBPTNUM(GLONBPT), WMDL, WSTOFCY(GLONFCY), WBPAADD
    
    #--- Issue X3-138438
    Gosub REFRESH_SORDER
    #--- End issue X3-138438
    
    # Récupération des paramètres stock(livraison) du site / de la société
    Call GLOBSTOFCY([M:SOH2]STOFCY) From TRTVENGLOB
    
    # ISSUE 110438 - 2015-10-09 by TODAN : Move the order hold message to after the Credit hold message
    #If [F:SOH]HLDSTA>1 : GERR=1 : GMESSAGE = mess(18,492,1) : Return : Endif  # order holds
    
    Raz GERR,GMESSAGE
    
    # Contrôle état crédit de la commande
    Call SDCDTSTA ([M:SOH0]SOHNUM,[M:SOH0]BPCORD,[M:SOH0]CHGTYP,0,"",[M:SOH0]ORDDAT,[M:SOH2]UNL,2,CDTSTA,GBIDD1,GBIDD1)
    &    From TRTVENCDT
    
    Gosub RECOVERED_AUPDTICK # Issue 107888 - 2016-03-21 by CPO : Scheduled invoices object management
    
    OK = 2
    Case CDTSTA
     When 2 : # Client bloqué
              GERR=1 : GMESSAGE = mess(52,192,1) : Return
     When 3 : # Dépassement d'en cours
              # FGR 10/03/2015 : X3SUIVI23273 (début)
              #GMESSAGE = mess(29,192,1)
              ## Si déblocage crédit non autorisé on bloque
              #If GCDTUNL=1
              #   GERR=1 : Return
              #Else
              #   Call AVERTIR(GMESSAGE,OK) From GESECRAN
              #   Raz GMESSAGE
              #   If OK=1 OK=0 : GERR=1 : Return : Endif
              #Endif
              Gosub CTL_DEPASS_ENCOURS
              If GERR = 1 Then
                Return
              Endif
              # FGR 10/03/2015 : X3SUIVI23273 (fin)
     When 4 : If GLOKORD = 2 : # Acomptes non versés
                 GERR=1 : GMESSAGE = mess(53,192,1) : Return
              Endif
     When 5 : # 78411 Sage Exchange
              Local Char VCRNUM
              Local Integer VCRTYP
              Call SEPP_CUR_DOC([F:SOH]SOHNUM,[L]VCRTYP,[L]VCRNUM) From SEPPCDT
              If [L]VCRNUM<>[F:SOH]SOHNUM
                If [L]VCRTYP=4
                  GMESSAGE = func AFNC.MES1(mess(52,2092,1),mess(54,198,1)-[L]VCRNUM)
                Else
                  GMESSAGE = func AFNC.MES1(mess(52,2092,1),mess(55,198,1)-[L]VCRNUM)
                Endif
              Else
                GMESSAGE = mess(9,2092,1)
              Endif
              GERR=1 : Return
     When Default
    Endcase
    
    # ISSUE 110438 - 2015-10-09 by TODAN : Move the order hold message to after the Credit hold message
    If [F:SOH]HLDSTA>1 : GERR=1 : GMESSAGE = mess(18,492,1) : Return : Endif  # order holds
    
    # Si livraison cde complète et cde non allouée totalement
    #If [M:SOH2]DME=3 & [M:SOH1]ALLSTA<>3 & [M:SOH0]ALLLINNBR<>0 & sum([M:SOH4]STOMGTCOD) <> [M:SOH4]NBLIG
    #   Call AVERTIR(mess(295,192,1),OK) From GESECRAN
    #   If OK=1 OK=0 : GERR=1 : Return : Endif
    #Endif
    Raz WLIG
    # On se sert de la variable ligne [M]GRPFLG(I) pour dire que la ligne est à préparer
    For I=0 To [M:SOH4]NBLIG-1
       [M:SOH4]GRPFLG(I) = 1
       WALLQTY = [M:SOH4]ALLQTY(I)
        #--- Issue 112531 by TS
       If [M:SOH4]DLVFLG(I)<>2 Goto NEXT_LIG3 Endif
       #---
       # Si composant de kit/sous-traité, la ligne sera traitée avec le composé
       If find([M:SOH4]LINTYP(I),3,4,5,11,12,13) Goto NEXT_LIG3 Endif
    
       If [M:SOH4]SOQSTA(I) <> 3 & [M:SOH4]DEMSTA(I) = 1
          If WLIG> 0 & [M:SOH4]DSTOFCY(I) <> WSTOFCY
             # Les sites expédition sont différents à la ligne
             GERR=1 : GMESSAGE = mess(317,192,1) : OK = 1 : Break
          Endif
          If WLIG> 0 & [M:SOH4]DBPAADD(I) <> WBPAADD
             # Les clients livrés sont différents à la ligne
             GERR=1 : GMESSAGE = mess(352,192,1) : OK = 1 : Break
          Endif
    
          # Cette ligne est en préparation
          #If sum([F:SOQ]LPRQTYSTU,[F:SOQ]OPRQTYSTU,[F:SOQ]PREQTYSTU)<>0
          #   GERR=2 : GMESSAGE = [F:SOQ]SOHNUM-":"-mess(27,159,1)-[F:SOQ]ITMREF-":"-mess(309,192,1)
          #   Goto NEXT_LIG3
          #Endif
    
          # Il n'y a rien à préparer sur cette ligne
          If [M:SOH4]LPRQTY(I)+[M:SOH4]OPRQTY(I)+[M:SOH4]PREQTY(I)+[M:SOH4]ODLQTY(I)+[M:SOH4]DLVQTY(I)>=[M:SOH4]QTY(I)
             Goto NEXT_LIG3
          Endif
          # Si article géré en stock
          If [M:SOH4]STOMGTCOD(I) <> 1
    
             # Si livraison ligne cde complète et ligne cde non allouée totalement
             #--- Bug 74688
             #If [M:SOH2]DME=2 & [M:SOH4]ALLQTY(I) <> 0 &
             If [M:SOH2]DME>1 & [M:SOH4]ALLQTY(I) <> 0 &
    &          ([M:SOH4]TALLQTY(I)+[M:SOH4]SHTQTY(I) < [M:SOH4]QTY(I))
                If WNBLLIV = 0
                   #--- Bug 74688
                   If [M:SOH2]DME = 2
                      Call OUINON(mess(296,192,1)+"\"+mess(112,191,1),OK) From GESECRAN
                   Else
                      Call OUINON(mess(353,192,1)+"\"+mess(112,191,1),OK) From GESECRAN
                   Endif
                   #---
                   If OK=1
                      WNBLLIV=9999
                      Goto NEXT_LIG3
                   Else
                      WNBLLIV+=1
                   Endif
                Elsif WNBLLIV=9999
                   Goto NEXT_LIG3
                Endif
             Endif
          # Si article non géré en stock
          Else
             # Si livraison cde ou ligne cde complète et qte à livrer saisie < reste à livrer
             If [M:SOH2]DME > 1 & [M:SOH4]TDLQTY(I) <> 0 &
    &        ([M:SOH4]TDLQTY(I)+[M:SOH4]LPRQTY(I)+[M:SOH4]OPRQTY(I)+[M:SOH4]PREQTY(I)+[M:SOH4]ODLQTY(I)+[M:SOH4]DLVQTY(I)<[M:SOH4]QTY(I))
                If WNBLLIV = 0
                   If [M:SOH2]DME = 2
                      Call OUINON(mess(212,192,1),OK) From GESECRAN
                   Else
                      Call OUINON(mess(213,192,1),OK) From GESECRAN
                   Endif
                   If OK=1
                      WNBLLIV=9999
                      Goto NEXT_LIG3
                   Else
                      WNBLLIV+=1
                   Endif
                Elsif WNBLLIV=9999
                   Goto NEXT_LIG3
                Endif
             Endif
          Endif
    
          If WALLQTY=0 & [M:SOH4]SHTQTY(I)<>0
             If GSHTDLV < 2
                If GERR=2 GMESSAGE+=" \ " Endif
                GERR=2 : GMESSAGE+=[M:SOH4]ITMREF(I)-format$(GFMDAT,[M:SOH4]DSHIDAT(I)) :#--CPO 83985 GFMDAT au lieu de GFMD
                         If !find([M]LINTYP(I),1,2,6,10) GMESSAGE -=":"-mess([M]LINTYP(I), 423,1) Endif
                         GMESSAGE+="\"+mess(183,192,1)
                Goto NEXT_LIG3
             Else
                If [F:ITM]ITMREF <> [M:SOH4]ITMREF(I)
                   Read [ITM]ITM0=[M:SOH4]ITMREF(I)
                   If fstat Raz [F:ITM] Endif
                Endif
                If GSHTDLV=2 & [F:ITM]NEGSTO<>2
                   If GERR=2 GMESSAGE+=" \ " Endif
                   GERR=2 :  GMESSAGE+=[M:SOH4]ITMREF(I)-format$(GFMDAT,[M:SOH4]DSHIDAT(I)) :#--CPO 83985 GFMDAT au lieu de GFMD
                              If !find([M]LINTYP(I),1,2,6,10) GMESSAGE -=":"-mess([M]LINTYP(I), 423,1) Endif
                              GMESSAGE+="\"+mess(184,192,1)
                   Goto NEXT_LIG3
                Endif
             Endif
          Endif
    
          # Ligne gérée en contremarque et commande d'achat non générée
          If [M:SOH4]FMI(I) > 1 & [M:SOH4]FMI(I) < 4 & [M:SOH4]FMINUM(I) = ""
             If [M:SOH4]ALLQTY(I)=0
                 # Il n'y a rien d'alloué : On bloque la livraison
                 If GERR=2 GMESSAGE+=" \ " Endif
                 GERR=2 :  GMESSAGE+=[M:SOH4]ITMREF(I)-format$(GFMDAT,[M:SOH4]DSHIDAT(I)) :#--CPO 83985 GFMDAT au lieu de GFMD
                           If !find([M]LINTYP(I),1,2,6,10) GMESSAGE -=":"-mess([M]LINTYP(I), 423,1) Endif
                           GMESSAGE+="\"+mess(111,192,1)
                 Goto NEXT_LIG3
             Else
                # Il y a des allocations : Elles ont été genérées manuellement : On demande si on veut livrer
                If WNBLCTM = 0
                   Call OUINON(mess(160,197,1)+"\"+mess(112,191,1),OK) From GESECRAN
                   If OK=1
                       WNBLCTM=9999
                       Goto NEXT_LIG3
                   Else
                       WNBLCTM+=1
                   Endif
                Elsif WNBLCTM=9999
                   Goto NEXT_LIG3
                Endif
             Endif
          Endif
          # Ligne gérée avec contremarque receptionnée et pas de quantité allouée
          If [M:SOH4]FMI(I)=3 & [M:SOH4]ALLQTY(I)=0
             If WNBLCTM = 0
                Call OUINON(mess(140,192,1)+"\"+mess(112,191,1),OK) From GESECRAN
                If OK=1
                   WNBLCTM=9999
                   Goto NEXT_LIG3
                Else
                   WNBLCTM+=1
                Endif
             Elsif WNBLCTM=9999
                Goto NEXT_LIG3
             Endif
          Endif
          # Ligne gérée avec un ordre de production et OF non généré
          If [M:SOH4]FMI(I) = 5 & [M:SOH4]FMINUM(I) = ""
             If [M:SOH4]ALLQTY(I)=0
                # Il n'y a rien d'alloué : On bloque la livraison
                If GERR=2 GMESSAGE+=" \ " Endif
                GERR=2 :  GMESSAGE+=[M:SOH4]ITMREF(I)-format$(GFMDAT,[M:SOH4]DSHIDAT(I)) :#--CPO 83985 GFMDAT au lieu de GFMD
                If !find([M]LINTYP(I),1,2,6,10) GMESSAGE -=":"-mess([M]LINTYP(I), 423,1) Endif
                GMESSAGE+="\"+mess(138,192,1)
    
                Goto NEXT_LIG3
             Else
                # Il y a des allocations : Elles ont été genérées manuellement : On demande si on veut livrer
                If WNBLCTM = 0
                   Call OUINON(mess(201,197,1)+"\"+mess(112,191,1),OK) From GESECRAN
                   If OK=1
                       WNBLCTM=9999
                       Goto NEXT_LIG3
                   Else
                       WNBLCTM+=1
                   Endif
                Elsif WNBLCTM=9999
                   Goto NEXT_LIG3
                Endif
             Endif
          Endif
          # Ligne gérée avec un ordre de production  et pas de quantité allouée
          If [M:SOH4]FMI(I)=5 & [M:SOH4]ALLQTY(I)=0
             If WNBLCTM = 0
                Call OUINON(mess(140,192,1)+"\"+mess(112,191,1),OK) From GESECRAN
                If OK=1
                   WNBLCTM=9999
                   Goto NEXT_LIG3
                Else
                   WNBLCTM+=1
                Endif
             Elsif WNBLCTM=9999
                Goto NEXT_LIG3
             Endif
          Endif
          If WLIG=0
              # Si la ligne est livrable on vérifie que transporteur et mode de livraison sont homogènes
              WBPTNUM=[M:SOH4]DBPTNUM(I)
              WMDL   =[M:SOH4]DMDL(I)
              # Pour contrôle site expé et adresse de livraison différents
              WSTOFCY=[M:SOH4]DSTOFCY(I)
              WBPAADD=[M:SOH4]DBPAADD(I)
          Elsif (WBPTNUM<>[M:SOH4]DBPTNUM(I) & [M:SOH4]DBPTNUM(I)<>"") | (WMDL<>[M:SOH4]DMDL(I) & [M:SOH4]DMDL(I)<>"")
              If WNBLMDL = 0
                  OK=2
                  Call OUINON(mess(133,191,1)+"\"+mess(205,100,1)+"\"+mess(134,191,1),OK) From GESECRAN
                  If OK=1
                      OK=0 : GERR=1 : Break
                  Else
                      WNBLMDL+=1
                  Endif
              Endif
          Endif
          [M:SOH4]GRPFLG(I) = 2
          WLIG += 1
       Endif
    $NEXT_LIG3
    Next I
    
    # Il n'y a rien à préparer
    If WLIG = 0
       GERR=1 : GMESSAGE += "\"+mess(316,192,1)
       OK = 1 : Return
    Endif
    Return
    
    #--- Issue X3-138438
    $REFRESH_SORDER
    Local File SORDER [SOHT]
    Read [SOHT]SOH0=[M:SOH0]SOHNUM
    If [F:SOHT]updTick <> [F:SOH]updTick
      Gosub RELIT From GOBJSUB
    Endif
    Close Local File [SOHT]
    Return
    #--- End issue X3-138438
    
    ###########################################################################################
    #    Après execution des boutons                                                          #
    ###########################################################################################
    $EXEBOUT
    
    GCONSDIA=0
    Case BOUT
        When "1"     :                                : # Allocation
                       # Bug 56454 : Si la gestion de l'objet n'a verrouillé l'enr, on le déverrouille
                       # (Et si la gestion de l'objet a verrouillé l'enr, il le déverrouillera dans $RELIT)
                       If VERROU=0 Unlock = SYMBOLE2  Endif
                       Gosub RELIT From GOBJSUB
        When "2"     : GFONC1=WFONC1                  : # Livraison
                       # FGR 24/04/2015 : X3SUIVI102508 (début)
                       If dim(SVADXMXL) >= 0 Then
                         adxmxl = SVADXMXL
                         Kill SVADXMXL
                       Endif
                       # FGR 24/04/2015 : X3SUIVI102508 (fin)
                       Raz [M:SOH4]GRPFLG
                       If clalev ([F:TSO])=0 Local File TABSOHTYP [TSO] Endif
                       If VERROU=0 Unlock = SYMBOLE2 Endif : # Bug 56454
                       Gosub RELIT From GOBJSUB
        When "3"     : GFONC1=WFONC1                  : # Facture
                       If VERROU=0 Unlock = SYMBOLE2 Endif : # Bug 56454
                       Gosub RELIT From GOBJSUB
                       # Issue X3-237574 - 2021-04-22 by SR
                       If dim(G111783C)>0 : Kill G111783C : Endif
        When "4"     : GFONC1=WFONC1                  : # Proforma
                       If VERROU=0 Unlock = SYMBOLE2 Endif : # Bug 56454
                       Gosub RELIT From GOBJSUB
        When "5"     :                                : # Solde
                       If VERROU=0 Unlock = SYMBOLE2 Endif : # Bug 56454
                       Gosub RELIT From GOBJSUB
        When "6"     : GFONC1=WFONC1                  : # Préparation
                       #Raz [M:SOH4]GRPFLG
    #                                                                      # hcb 97100 deb
    #                   If VERROU=0 Unlock = SYMBOLE2 Endif : # Bug 56454
                       # pour resoudre ce bug le lock n est plus fait sur l entete mais sur les lignes
                          For [SOQ]SOQ0 Where SOHNUM = [M:SOH0]SOHNUM
                              SYMBOLE2 = "SOQ"+[F:SOQ]SOHNUM+"\"+num$([F:SOQ]SOPLIN)+"\"+num$([F:SOQ]SOQSEQ)
                              Unlock = SYMBOLE2
                          Next
    #                                                                      # hcb 97100 deb
                       Gosub RELIT From GOBJSUB
    
                       #--- Issue X3-43236
                       Local Char SYMBOLE1(50)
                       SYMBOLE1="SOH"+[M:SOH0]SOHNUM : Lock=SYMBOLE1
                       #---
        When "8"     : #Orders
                       # Issue X3-135076 by ANKUL
                       Gosub RELIT From GOBJSUB
                       # Issue X3-135076 end
    
    Endcase
    Return
    ###########################################################################################
    #    Après execution des menus                                                            #
    ###########################################################################################
    $STATUT
    #fq6051-gbn
    GCONSULT=SAV_GCONSULT
    GCONSDIA=SAV_GCONSDIA
    
    GCONSDIA=0
    
    Case BOUT
        When "E"     : If mkstat=4 & GREP=""            : # Texte entete
    #                      GREP="M" : REP="M"
    #                      Gosub SETBOUT From GOBJSUB
                           Gosub AVANT_MOD_BOUT         :  # Bug 77357
                           Gosub ENTRE_MODIF From GOBJSUB
                       Endif
                       If [M]SOHTEX1 <> "" & !GIMPORT
                           Call SET_IMAGE (4) From GESECRAN
                       Elsif !GIMPORT
                           Call RESET_IMAGE (4) From GESECRAN
                       Endif
        When "F"     : If mkstat=4 & GREP=""            : # Texte pied
    #                      GREP="M" : REP="M"
    #                      Gosub SETBOUT From GOBJSUB
                           Gosub AVANT_MOD_BOUT         :  # Bug 77357
                           Gosub ENTRE_MODIF From GOBJSUB
                       Endif
                       If [M]SOHTEX2 <> "" & !GIMPORT
                           Call SET_IMAGE (4) From GESECRAN
                       Elsif !GIMPORT
                           Call RESET_IMAGE (4) From GESECRAN
                       Endif
        When "H"     : If [M:ADB1]ADBFLG = 2 | [M]CNTNAM <> [M:ADB1]CNTNAM : # Adresse client commande
                           # Dde 77155 : Dégriser le bouton enregistrer si utilisation système de taxes américaines
                           #If GREP <> "C" & GREP <> "M" & GREP <> "D"
                           # If GLOCUSATAX   # 106867.o
                           If func AFNC.ACTIV("LTA") & [F:CPY]SSTTAXACT = 2   # 106867.n
                               Gosub ENTRE_MODIF From GOBJSUB
                           Elsif GREP <> "C" & GREP <> "M" & GREP <> "D"
                               Gosub MAJADRESSE From SUBSOHB
                           Endif
                           If [M:ADB1]BPRNAM(0) <> ""
                               [M:SOH0]BPCNAM = [M:ADB1]BPRNAM(0)
                               Affzo [M:SOH0]BPCNAM
                           Endif
                       Endif
        When "J"     :                                                     : # Adresse client facture
                       If [M:ADB3]ADBFLG = 2 | [M]CNTNAM <> [M:ADB3]CNTNAM
    #&                     (dim([M]EECNUM)>0 & [M]EECNUM <> [M:ADB3]EECNUM)
                           # Dde 77155 : Dégriser le bouton enregistrer si utilisation système de taxes américaines
                           #If GREP <> "C" & GREP <> "M" & GREP <> "D"
                           # If GLOCUSATAX   # 106867.o
                           If func AFNC.ACTIV("LTA") & [F:CPY]SSTTAXACT = 2   # 106867.n
                               Gosub ENTRE_MODIF From GOBJSUB
                           Elsif GREP <> "C" & GREP <> "M" & GREP <> "D"
                               Gosub MAJADRESSE From SUBSOHB
                           Endif
                           If [M:ADB3]BPRNAM(0) <> ""
                               [M:SOH1]BPINAM = [M:ADB3]BPRNAM(0)
                               Affzo [M:SOH1]BPINAM
                           Endif
                       Endif
        When "K"     : If [M:ADB2]ADBFLG = 2 | [M]CNTNAM <> [M:ADB2]CNTNAM : # Adresse client livré
                           # Dde 77155 : Dégriser le bouton enregistrer si utilisation système de taxes américaines
                           #If GREP <> "C" & GREP <> "M" & GREP <> "D"
                           # 79705 : V7 : SAT in SPRICLINK
                           # Dégriser le bouton enregistrer si la recherche tarif a été executée
                           #If GLOCUSATAX
                           # If GLOCUSATAX | (!find(GREP,"C","M","D") & sum([M]UPDFLG)<>0)   # 106867.o
                           If (func AFNC.ACTIV("LTA") & [F:CPY]SSTTAXACT = 2) | (!find(GREP,"C","M","D") & sum([M]UPDFLG)<>0)   # 106867.n
                               Gosub ENTRE_MODIF From GOBJSUB
                           Elsif GREP <> "C" & GREP <> "M" & GREP <> "D"
                               Gosub MAJADRESSE From SUBSOHB
                           Endif
                           If [M:ADB2]BPRNAM(0) <> ""
                               [M:SOH1]BPDNAM = [M:ADB2]BPRNAM(0)
                               Affzo [M:SOH1]BPDNAM
                           Endif
                           Gosub SHOW_HIDE_ENTCOD From TRTADRLIB   #LTA.n
                       Endif
        When "U"     : If mkstat=4 & GREP=""                               : # Informations CEE
    #                      GREP="M" : REP="M" : # Pour forcer le bouton 'enregistrer'
                           Gosub AVANT_MOD_BOUT         :  # Bug 77357
                           Gosub ENTRE_MODIF From GOBJSUB
                       Endif
        When "L","M" : GFCY=WFCY                                           : # Contremarque
                       #Call GETDEV(GFCY) From DEVSUB
                       # Chargement globales référenciels, comptes et sections de la société
                       Gosub CHARG_PARAM : Raz GERR : Raz GMESSAGE
                       Gosub RELIT From GOBJSUB
                       # Bug 45999 : Revérouiller la cde qui a été dévérouillée dans le traitement de la ctm
                       # Bug 73310 : Verrou doit être fait après le relit (et non avant) sinon, si ctm avec intersociété, c'est la cde intersociété qui est lockée
                       Gosub VERROU_SOH
        When "R","T" :                                                     : # Acompte, Situation
                       Gosub RELIT From GOBJSUB
        When "S"     :                                                     : # 78411 Sage Exchange
                       Call SDCDTSTA([M]SOHNUM,[M]BPCORD,[M]CHGTYP,0,[M:SOH1]CUR,[M]ORDDAT,[M]UNL,1,[M]CDTSTA,[M]OST,[M]OSTAUZ) From TRTVENCDT
                       Affzo [M:SOH1]CDTSTA
                       Gosub MANHLD_LIENS From MANHLDLIB
    Endcase
    
    Return
    ###########################################################################################
    # 79705 : V7 : SAT in SPRICLINK
    #######################################################################
    # Après exécution d'une action et avant l'exécution de l'action suite #
    #######################################################################
    $AVANT_SUITE
    Case BOUT
      When "H","J","K" :  # After execution Adresse and before execution recalculate prices
        # Not trigger recalculate prices if globale not informed
        If (dim(GADDACTMOD)<0 | GADDACTMOD<>"1") OK=0 Endif
    Endcase
    Return
    # 79705 : V7 : SAT in SPRICLINK
    #########################################################################
    $BOITE
    
    Return
    ####################################################################
    $EFFMASK
    Return
    ####################################################################
    ####################################################################
    $RAZDUP
    #-----------------------------------------------#
    # Réinitialisation des champs avant duplication #
    #-----------------------------------------------#
    Local Shortint I, NLIG
    Local Integer  WRET
    Local Char     VAT(GLONVAT)(3)
    Local Integer  WKIT : # Bug 56680
    [M:SOH1]HLDSTA=1      # order holds
    Raz [M:SOH1]HLDCOD
    
    #############################################################
    #Modif CRM 01/09/2004
    #On détecte s'il y a des lignes relatives à des contrats de service
    Local Integer  ITERSOH4
    ITERSOH4 = 0
    For ITERSOH4 = 0 To [M:SOH4]NBLIG - 1
        If [M:SOH4]CONNUM(ITERSOH4) <> ""
            Raz [M:SOH4]
            Break
        Endif
    Next
    #############################################################
    
    GCONSDIA=0
    #------------------------------------------------------------------------#
    # Récupération des paramètres vente du site / de la société              #
    # Chargement globales référenciels, comptes et sections de la société    #
    # -----------------------------------------------------------------------#
    GFCY = [M:SOH0]SALFCY
    Call GLOBVAR(GFCY,"VEN") From TRTX3
    Gosub CHARG_PARAM : : If GERR=1 OK=0 : Return Endif
    #Call GETDEV(GFCY) From DEVSUB
    
    [M:SOH2]ALLTYP=GALLTYP
    
    Call RAZ_CLOB From ACLOB
    If left$([M:SOH0]SOHTEX1,3)="SOH"
       Call DUP_CLOB("SOH",[M:SOH0]SOHTEX1,WRET) From TRTX3TEX
       If WRET<1 Raz [M:SOH0]SOHTEX1 Endif
    Endif
    If left$([M:SOH0]SOHTEX2,3)="SOH"
       Call DUP_CLOB("SOH",[M:SOH0]SOHTEX2,WRET) From TRTX3TEX
       If WRET<1 Raz [M:SOH0]SOHTEX2 Endif
    Endif
    
    Raz GTARFLG
    Raz [M:SOH0]SOHNUM, [M:SOH0]REVNUM, [M]PRFNUM
    If dim([M:SOH1]LNDRTNDAT) > 0
        Raz [M:SOH1]LNDRTNDAT
        If [M:SOH0]SOHCAT=2
            [M:SOH1]LNDRTNDAT  = addmonth([M:SOH0]ORDDAT,1)
        Endif
    Endif
    #   Réalimentation des flags inter-site et inter-société
    Call ALIBETCPY(2,[M:SOH0]SALFCY,[M:SOH0]BPCORD,GBIDC1,[M:SOH0]POHFCY,[M:SOH0]BPSNUM,[M:SOH1]BETFCY,[M:SOH1]BETCPY) From TRTVENISOC
    If [M:SOH1]BETFCY=2
        #   Si commande inter-société, et site achat et fournisseur sont renseignés
        #   --> Alimentation du site d'origine pour déclencher l'automatisme
    #    If [M:SOH0]BPSNUM<>"" & [M:SOH0]POHFCY<>""
    #        [M:SOH0]ORIFCY=[M:SOH0]SALFCY
    #    Else
    #        Raz [M:SOH0]ORIFCY
    #    Endif
        # Commande de vente inter-site sans flux automatique
        [M:SOH0]ORIFCY=[M:SOH0]SALFCY
        Raz [M:SOH0]CUSORDREF
    Endif
    
    [M:SOH0]ORDDAT=date$
    # Initialisation de la date d'expédition avec la date du jour
    [M:SOH2]SHIDAT=date$
    # Contrôle de la date d'expédition avec les périodes d'indisponibilités du site
    # (Si indisponibilité on ne peut décaler que vers l'avant)
    Call CTLUVYFCY([M:SOH2]SHIDAT, [M:SOH2]STOFCY, 0) From TRTVENCTL
    # Calcul de la date de livraison demandée
    Call CALC_DLVDAT([M:SOH2]SHIDAT, [M:SOH2]DAYLTI, [M:SOH1]BPAADD, [M:SOH0]BPCORD, 0, 0, [M:SOH2]DEMDLVDAT) From TRTVENDAT
    # Dde 19843 : Test GADJSHIDAT : Globale cachée = 1 : Pas d'ajustement date d'expédition (nvx param en V150)
    If dim(GADJSHIDAT)>0 & GADJSHIDAT=1
    Else
        # Recadrage si possible de la date d'expédition par rapport à la date de livraison demandée calculée
        Local Date WSHIDAT : WSHIDAT=[M:SOH2]SHIDAT
        Call CALC_SHIDAT([M:SOH2]DEMDLVDAT, [M:SOH2]DAYLTI, [M:SOH2]STOFCY, 1, 1, [M:SOH0]ORDDAT, WSHIDAT) From TRTVENDAT
        Raz GMESSAGE
        If WSHIDAT<=[M:SOH2]DEMDLVDAT-[M:SOH2]DAYLTI [M:SOH2]SHIDAT=WSHIDAT Endif
    Endif
    Raz [M:SOH1]CCLREN, [M:SOH1]CCLDAT
    #Raz [M:SOH1]CDTSTA    : # Pour recalculer l'état crédit
    Raz [M:SOH2]UNL
    
    # 107890 : Scheduled invoices : (LD:14/01/16)
    If [M:SOH0]SOHCAT=1
        [M:SOH3]VCRINVCNDDAT=[M:SOH0]ORDDAT
    Endif
    # 107890 : Scheduled invoices : (LD:14/01/16)
    
    [M:SOH1]ORDSTA = 1:[M:SOH1]ALLSTA=1:[M:SOH1]DLVSTA=1:[M:SOH1]INVSTA=1
    [M:SOH1]OCNPRN = 1
    
    # --> Gestion des signatures : Positionnement flag modif signature
    [M:SOH1]APPFLG = 1  : GUPDAPPFLG=1
    
    # 94587 : Pb naming convention
    #Raz [M:SOH0]YAPPFLG  : # 89410 : Pb maj encde client en suppression ligne
    Raz [M:SOH0]OLDAPPFLG
    # 94587
    
    Raz [M:SOH2]LASDLVNUM, [M:SOH2]LASDLVDAT
    Raz [M:SOH3]PRFNUM, [M:SOH3]LASINVNUM, [M:SOH3]LASINVDAT
    
    Raz [M:SOH3]SQHNUM
    
    Raz [M:SOH1]PREOPP           # FGR 05/01/2016 : X3SUIVI71065 : en duplication il faut effacer l'affaire d'origine
    #--CPO 71065 - Code affaire à la ligne (Partie : rajout paramètre société pour contrôle documents mono-affaire)
    #--Duplication avec paramètre à OUI => si le code affaire de la ligne est <> de celui de l'en-tête, on reprend l'en-tête
    Call TRAITE_DUPLICATION("[M:SOH1]PJT") From TRTPJT
    #--/CPO
    
    # -- Il faut recalculer les mnt à livrer
    Raz [M:SOH4]DLRNOT, [M:SOH4]DLRATI
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    Raz [M:SOH4]INRNOT, [M:SOH4]INRATI, [M:SOH4]INRSCHNOT, [M:SOH4]INRSCHATI
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    
    # -------------------------------------------------
    # Issue X3-25616/121617 - 2017-02-21 by FGR : BEGIN
    Local Integer IACTPJM
    
      IACTPJM = func ASYRFNC.ACTIV("PJM")
    # Issue X3-25616/121617 - 2017-02-21 by FGR : END
    # -------------------------------------------------
    
    # Issue 121688
    # Alimentation des zones en-cours (dépend du tiers risque du client cde et de la devise du clt facture)
    Call SDCDTSTA("",[M]BPCORD,[M]CHGTYP,0,[M]CUR,[M]ORDDAT,[M]UNL,1,[M]CDTSTA, [M]OST,[M]OSTAUZ) From TRTVENCDT
    # End issue 121688
    
    For I=0 To [M:SOH4]NBLIG-1
        Raz [M:SOH4]UPDFLG(I)
        Raz [M:SOH4]CREFLG(I)
    
        Raz [M:SOH4]DPREOPP(I)   # FGR 05/01/2016 : X3SUIVI71065 : en duplication il faut effacer l'affaire d'origine
    #   --> Initialisation des dates
        [M:SOH4]DSHIDAT(I)=[M:SOH2]SHIDAT
        [M:SOH4]DDEMDLVDAT(I)=[M:SOH2]DEMDLVDAT
        If func AFNC.ACTIV("EDIX3")   # Ini X3-141143_Duplicate_Sales_order_maxdelivery_date_is_not_updated (JUCON 22/05/19)
          [M:SOH4]MAXDLVDAT(I)=[M:SOH4]DDEMDLVDAT(I)
        Endif                         # End X3-141143_Duplicate_Sales_order_maxdelivery_date_is_not_updated (JUCON 22/05/19)
        [M:SOH4]DALLTYP(I)=[M:SOH2]ALLTYP
    #   --> date de livraison prevue
        Call CALC_DLVDAT([M:SOH4]DSHIDAT(I), [M:SOH4]DDAYLTI(I), [M:SOH4]DBPAADD(I), [M:SOH0]BPCORD, 0,0,
    &                    [M:SOH4]EXTDLVDAT(I)) From TRTVENDAT
        Raz GMESSAGE
        Raz [M:SOH4]ALLQTY(I),  [M:SOH4]ALLQTYSTU(I)
        Raz [M:SOH4]TALLQTY(I), [M:SOH4]TALLQTYSTU(I)
        Raz [M:SOH4]SHTQTY(I),  [M:SOH4]SHTQTYSTU(I)
        Raz [M:SOH4]WALLQTY(I), [M:SOH4]WALLQTYSTU(I)
        # Init de la qté à allouer selon paramètre
        # Bug 72631 : Si pas de gestion des signatures, il faut initialiser la qté à allouer
        #If GINIALLORD=2 & (GSOHAPPORD=2 & GSOHAPPALL=2)
        If GINIALLORD=2 & (GAPPSOH<2 | (GSOHAPPORD=2 & GSOHAPPALL=2))
            # -- Si Commande non bloquée
            #       Ligne ferme
            #       Article géré en stock ou composé kit/sous-traité
            # ----> Initialisation de la qté à allouer
            If  [M:SOH1]CDTSTA<>2 & [M]DEMSTA(I)=1 & [M]FMI(I)=1 & ([M]STOMGTCOD(I)<>1 | find([M]LINTYP(I),2,10))
                # (Il faut toujours repartir des qté en US pour effectuer les calculs)
                # --- Qté à allouer = Qté déjà allouée + Reste à allouer
                Local Decimal WCOEF
                [M]WALLQTYSTU(I)=[M]QTYSTU(I)
                WCOEF=1/[M]SAUSTUCOE(I)
                Call CNVQTY([M]WALLQTYSTU(I),WCOEF,[M]SAU(I),[M]WALLQTY(I)) From TRTVENQTE
            Endif
        Endif
        # Bug 72631 : Pb failure to allocate kit component lines when kit header is allocated
        ## Bug 56680 : Pb kit géré en ctm
        ## Si un kit n'est pas à allouer, les composants ne sont pas à allouer
        #If !find([M]LINTYP(I),3,4,5)
        #    Raz WKIT
        #Elsif [M]LINTYP(I)=2
        #    WKIT=I
        #Elsif [M]WALLQTYSTU(WKIT)=0
        #    Raz [M]WALLQTYSTU(I), [M]WALLQTY(I)
        #Endif
        If [M]LINTYP(I)=2
            WKIT=I
        Elsif !find([M]LINTYP(I),3,4,5)
            Raz WKIT
        Elsif [M]WALLQTYSTU(WKIT)=0
            Raz [M]WALLQTYSTU(I), [M]WALLQTY(I)
        Endif
        # Bug 72631
        Raz [M:SOH4]YALLQTY(I), [M:SOH4]YSHTQTY(I)
        Raz [M:SOH4]LPRQTY(I),  [M:SOH4]OPRQTY(I), [M:SOH4]PREQTY(I)
        Raz [M:SOH4]ODLQTY(I),  [M:SOH4]DLVQTY(I), [M:SOH4]INVQTY(I)
        Raz [M:SOH4]LINREVNUM(I), [M:SOH4]FMINUM(I), [M:SOH4]POPLIN(I)
    
        If left$([M:SOH4]SOQTEX(I),3)="SOQ"
           Call DUP_CLOB("SOQ",[M:SOH4]SOQTEX(I),WRET) From TRTX3TEX
           If WRET<1 Raz [M:SOH4]SOQTEX(I) Endif
        Endif
    
        Raz [M:SOH4]DETSQHNUM(I), [M:SOH4]SQDLIN(I)
    
        # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan  - 2020-07-16 by LD
        If dim([M:SOH4]PRGBILNUM)>0 Raz [M:SOH4]PRGBILNUM(I) Endif
        # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan  - 2020-07-16 by LD
        # 200515 : Progress billing / X3-217059 : Blocking control modification on price structure updates on sales order line - 2020-10-06 by LD
        If dim([M:SOH4]PBILDTOINV) > 0 [M:SOH4]PBILDTOINV(NOL)=1 Endif
        # 200515 : Progress billing / X3-217059 : Blocking control modification on price structure updates on sales order line - 2020-10-06 by LD
    
        [M:SOH4]SOQSTA(I) = 1
        Raz [M:SOH4]DCCLREN(I), [M:SOH4]DCCLDAT(I)
        [M:SOH4]INVFLG(I) = 1
        NLIG=I
        #----------------------------------------------------------------------------#
        # Recalcul du mnt à liv HT et TTC de la ligne (puisque raz des qtés livrées) #
        #----------------------------------------------------------------------------#
        VAT (0)     =  [M:SOH4]VAT1(I)
        VAT (1)     =  [M:SOH4]VAT2(I)
        VAT (2)     =  [M:SOH4]VAT3(I)
        If [M:SOH4]DEMSTA(I) = 1 Gosub CALC_DLR From SUBSOHB : Endif
        [M:SOH4]DLRNOT += [M:SOH4]LINDLRNOT(I)
        [M:SOH4]DLRATI += [M:SOH4]LINDLRATI(I)
        # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
        [M:SOH4]INRSCHNOT += [M:SOH4]LININRSCHNOT(I)
        [M:SOH4]INRSCHATI += [M:SOH4]LININRSCHATI(I)
        # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
        # -------------------------------------------------
        # Issue X3-25616/121617 - 2017-02-21 by FGR : BEGIN
        If IACTPJM Then
          Raz [M:SOH4]SOQPSONUM(I)
          Raz [M:SOH4]SOQSEQNUM(I)
        Endif
        # Issue X3-25616/121617 - 2017-02-21 by FGR : END
        # -------------------------------------------------
        # Issue X3-244837 by MRDAB
        If dim([M:SOH4]PCNTNUM) > 0 and [V]GPREFUN = 2
          Raz [M:SOH4]PCNTNUM(I)
        Endif
        # Issue X3-244837 end
    Next I
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    # To invoice amount not managed for loan order and intracompany order
    If [M:SOH0]SOHCAT<>2 & !([M:SOH1]BETFCY=2 & [M:SOH1]BETCPY<=1)
        [M:SOH4]INRNOT = [M:SOH4]DLRNOT + [M:SOH4]INRSCHNOT
        [M:SOH4]INRATI = [M:SOH4]DLRATI + [M:SOH4]INRSCHATI
    Endif
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    
    # --> Rechargement du code compteur
    #If [F:TSO]SOHTYP <> [M:SOH0]SOHTYP                                  # FGR 05/10/2015 : X3SUIVI113195
    If [F:TSO]SOHTYP <> [M:SOH0]SOHTYP | find([F:TSO]LEG,GCURLEG)<1      # FGR 05/10/2015 : X3SUIVI113195
        # FGR 19/11/2012 : X3SUIVI71937
        #Read [F:TSO]TSO0 = [M:SOH0]SOHTYP
        #If fstat Raz [F:TSO] : Call RSTA("TSO", [M:SOH0]SOHTYP) From GLOCK : Endif
        Local Integer WERR
        Call LEC_TSO_LEG(GCURLEG,[M:SOH0]SOHTYP,WERR) From TRTLECLEG
        If WERR Raz [F:TSO] : Call RSTA("TSO", [M:SOH0]SOHTYP) From GLOCK : Endif
    Endif
    
    # 75115 : V7 : Extension of Digital Signature : New field delivery type
    [M:SOH2]SDHTYP=[F:TSO]SDHTYP
    GMANCOU=[F:TSO]MANCOU : GCPT=[F:TSO]CODNUM
    If [F:TSO]CODNUM <> ""
        GMANCOU=[F:TSO]MANCOU : GCPT=[F:TSO]CODNUM
    Else
    #-- Aucun compteur associé au type de commande
        Call LECTCA(5,WRET) From SUBTCA
        If fstat | !WRET
            GERR=1 : GMESSAGE=mess(58,105,1)-mess(5,14,1)-mess(250,199,1) : Return
        Endif
    #   Compteur : Normale (9) Prêt (10) Facturation directe (11)
        GMANCOU = [F:TCA]MANCOU([F:TSO]SOHCAT+8) : GCPT = [F:TCA]CODNUM([F:TSO]SOHCAT+8)
    Endif
    
    If dim(GWEBSERV)=1 & GWEBSERV=1
        Raz GWEBFOCITMREF, GWEBFOCQTY, GWEBFOCUOM, GWEBFOCMOTIF, GWEBNBGRA
    Endif
    
    Call NTSDUP([M:SOH0]BPCORD,"BPCORD") From TRTNTSCTL   # customer notes
    
    #------------------------------------------------------------#
    # Activation/Desactivation des zones en fonction du contexte #
    #------------------------------------------------------------#
    Gosub GRIZE_LIENS
    
      # FGR 13/01/2014 : X3SUIVI96419 (début)
      Raz [M:SOH0]NBCON
      Raz [M:SOH0]CONUMDEL
      Raz [M:SOH0]CONNUMLIG
      # FGR 13/01/2014 : X3SUIVI96419 (fin)
    
    Affzo [M:SOH0]1-99
    Affzo [M:SOH1]1-99
    Affzo [M:SOH2]1-99
    Affzo [M:SOH3]1-99
    Affzo [M:SOH4]1-99
    
    Raz YSQHNUM
    
    #------------------------------------------------------------#
    # Renseignement des unités de répartition                    #
    #------------------------------------------------------------#
    [M:SOH0]DSPWEU = GSALDSPWEU
    [M:SOH0]DSPVOU = GSALDSPVOU
    
    Raz GSOHSUPPLIGDSP :#--CPO 79343
    
    Gosub FREEGROUP_GSOHVCRINVCND From LIBSAL_INVCND_SOH # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #--Also we have to Raz the differents flags
    Raz [M:SOH4]DINVCNDISCHG, [M:SOH4]DINVCNDPREV, [M:SOH4]DINVCNDTODEL, [M:SOH4]DINVCNDTOUPD, [M:SOH4]DINVCNDTODIS
    # End issue 107888
    
    # Issue X3-135076 by ANKUL - drives visibility of fields for PT Signature
    If func AFNC.ACTIV('KPO') > 0
      If dim([M:SOH1]SOHCFMFLG) > 0 and dim([M:SOH0]SOHNUMEND) > 0 and dim([M:SOH1]SOHVALDAT) > 0
          Raz [M:SOH1]SOHCFMFLG, [M:SOH0]SOHNUMEND, [M:SOH1]SOHVALDAT
      Endif
    Endif
    # Issue X3-135076 end
    Gosub RESET_PREP_STA From SUBSOHA1  #Issue X3-246884 by SDEM
    Return
    ####################################################################
    $LIENS
    
    Gosub LIENS_SOH
    
    If GHISTO=0
        # Remise à jour des statuts de la commande
        Trbegin [SOH]
        Gosub MAJSTASOH From SUBSOHB
        # --------------------------------------
        # FGR 25/06/2015 : X3SUIVI109125 (début)
        #Commit
        If GOK = 0 Then
          Rollback
        Else
          Commit
          # Note FGR fait dans $LIENS_SOH après Call SDCDTSTA pour ne le faire qu'une seule fois
          # Issue 110827 - 2015-09-28 by CPO : Obsolete record
          #--The code before has to be executed (the $LIENS_SOH is called before this actual commit)
          Read [SOH]=
          If dim([L]AUPDTICK) > 0 and dim([F]updTick) > 0 Then
            [L]AUPDTICK = [F:SOH]updTick
          Endif
          # End issue 110827
        Endif
        # FGR 25/06/2015 : X3SUIVI109125 (fin)
        # --------------------------------------
    Endif
    
    # Gestion de l'état des zones
    Local Char WSVGGREP(type(GREP)-10)
    WSVGGREP = GREP : Raz GREP
    Gosub GRIZE_LIENS
    GREP = WSVGGREP
    
    #------------------------#
    # affichage icone texte  #
    #------------------------#
    If [M:SOH0]SOHTEX1 <> "" | [M:SOH0]SOHTEX2 <> ""
      If !GIMPORT : Call SET_IMAGE (4) From GESECRAN : Endif
    Else
      If !GIMPORT : Call RESET_IMAGE (4) From GESECRAN : Endif
    Endif
    
    If [M:SOH4]NBLIG <> 0 & sum([M:SOH4]DETSQHNUM) <> ""
       For I=0 To [M:SOH4]NBLIG-1
          If [M:SOH4]DETSQHNUM(I) <> ""
             YSQHNUM = [M:SOH4]DETSQHNUM(I)
             Break
          Endif
       Next I
    Endif
    
    #####################################################
    # Contrôle de l'incrémentation du cyle de vente des affaires   Modif CRM 22/10/2003
    #####################################################
    Call SETPREOPP("SOH") From SUBOPPB
    
    # Remplissage des boites de picking
    Gosub REMPBOX From SUBSOHC
    
    Raz GSOHSUPPLIGDSP :#--CPO 79343
    
    Gosub FREEGROUP_GSOHVCRINVCND From LIBSAL_INVCND_SOH # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    
    #If GACTX.USER="CPOx"
    #  Infbox "$LIENS Après FREEGROUP : GWFREEHEAP ="-num$(GWFREEHEAP)+"<>"+num$(int(freeheap/1024))
    #Endif
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #--Also we have to Raz the differents flags
    Raz [M:SOH4]DINVCNDISCHG, [M:SOH4]DINVCNDPREV, [M:SOH4]DINVCNDTODEL, [M:SOH4]DINVCNDTOUPD, [M:SOH4]DINVCNDTODIS
    # End issue 107888
    
    # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line            "
    If !GIMPORT and !GWEBSERV
      # Issue X3-128239
    #  If dim([M]WALLTXT)>0
    #    Raz [M]WALLTXT : Affzo [M]WALLTXT
    #  Endif
    #  If dim([M]WSTKTXT)>0
    #    Raz [M]WSTKTXT : Affzo [M]WSTKTXT
    #  Endif
      If dim([M:SOH4]WALLTXT)>0
        Raz [M:SOH4]WALLTXT : Affzo [M:SOH4]WALLTXT
      Endif
      If dim([M:SOH4]WSTKTXT)>0
        Raz [M:SOH4]WSTKTXT : Affzo [M:SOH4]WSTKTXT
      Endif
      # End issue X3-128239
    Endif
    # /User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO
    
    # Issue X3-135076 by ANKUL - drives visibility of fields for PT Signature
    Gosub SOHNUMEND_SET_VISIBILITY From SUBSOHA
    # Issue X3-135076 end
    
    Call SHOW_HIDE_PREPAYMENT_INVOICE_FIELDS([M:SOH0]SALFCY) From SUBSOHA1 # Issue X3-243690 by MRDAB
    Gosub READ_PREPAYMENT_INVOICE_STATUS From SUBSOHA1 # Issue X3-244837 by MRDAB
    Gosub DISABLE_FIELDS_FOR_INVOICED_PREPAYMENTS From SUBSOHA1 # Issue X3-246053 by MRDAB
    Return
    
    ####################################################################
    $LIENS_SOH
    
    #------------------------------------------------------------------------#
    # Chargement globales référenciels, comptes et sections de la société    #
    # Chargement des sections analytiques entête du document                 #
    # Récupération des paramètres vente du site / de la société              #
    # Réalimentation du cours devise dossier/devise cde                      #
    # -----------------------------------------------------------------------#
    GFCY = [F:SOH]SALFCY
    #Call GETDEV(GFCY)  From DEVSUB
    Call GLOBVAR(GFCY,"VEN") From TRTX3
    Gosub CHARG_PARAM : Raz GERR : Raz GMESSAGE
    Call CHARG_CCEH("SOH3","NBAXE","SOH") From TRTX3CPT
    #----------------------------------------------------#
    # Chargement libellés et formats colonnes tarif      #
    #----------------------------------------------------#
    #If GACTMUL=2
    # Alimentation concernant les colonnes frais/remises en fonction de la structure tarif de la société
    Call ALICOLREM (1,2,GFLAG,"SOH4",[M:SOH1]CUR,0,[M:SOH0]PLISTC) From TRTPRICE
    #Else
    #    # Alimentation du format des colonnes frais/remise
    #    Call ALIFORREM (2, GFLAG, "SOH4", 0, [M:SOH1]CUR) From TRTPRICE
    #Endif
    # -----------------------------------------------------------------------#
    # Affichage entêtes colonnes variables (comptes et sections analytiques) #
    # -----------------------------------------------------------------------#
    Gosub AFF_TITCOL
    #--------------------------------------------------#
    # Init. nbre de postes des elements de facturation #
    # Init. du tableau     des elements de facturation #
    #--------------------------------------------------#
    Read [F:BPR]BPR0 = [M]BPCINV
    If fstat
       Raz [F:BPR] : Call RSTA("BPR",[M]BPCINV) From GLOCK
    Endif
    #----------------------------------#
    # Alimentation nb axes analytiques #
    #----------------------------------#
    #If dim([M:SOH3]NBAXE) > 0 [M:SOH3]NBAXE = GOPTCANA : Endif
    #----------------------------------------------------#
    # Récupération du format de saisie des frais/remises #
    #----------------------------------------------------#
    #Call FMTREM("SOH4",[M:SOH1]CUR) From TRTPRICE
    
    #---------------------------------------------------------#
    # Lecture Client facture : Alimentation du nom client     #
    #                          Alimentation de l'en-cours     #
    #---------------------------------------------------------#
    Read [BPC]BPC0 = [F:SOH]BPCINV
    If fstat
       Raz [F:BPC]
       Call RSTA("BPC",[F:SOH]BPCINV) From GLOCK
       [F:BPC]CUR = GLOCALDEV
    Endif
    Local Integer NBPOSTE
    NBPOSTE=dim([M:SOH3]INVDTA)
    Call STRUFOOT (3,"SOH3",NBPOSTE,[F:SOH]CHGTYP,[F:BPC]CUR,[F:SOH]CUR,"NON") From SUBSFIT
    [M:SOH3]NBFAC = NBPOSTE
    
    If [F:SOH]BPINAM(0) <> "" [M:SOH1]BPINAM = [F:SOH]BPINAM(0)
                         Else [M:SOH1]BPINAM = [F:BPC]BPCNAM    : Endif
    # Issue 113254 - 2016-02-15 by CPO : Problème en gestion de l'état crédit des commandes de vente
    #Dans ce cas il n'y a aucune raison de mettre à jour ce flag. Tout du moins de le passer en dépassement.
    #--
    #Call SDCDTSTA([F:SOH]SOHNUM,[F:SOH]BPCORD,[F:SOH]CHGTYP,0,[F:SOH]CUR,[F:SOH]ORDDAT,[F:SOH]UNL, 2, [M]CDTSTA,[M]OST,[M]OSTAUZ) From TRTVENCDT
    If [F:SOH]ORDSTA<2
      Call SDCDTSTA([F:SOH]SOHNUM,[F:SOH]BPCORD,[F:SOH]CHGTYP,0,[F:SOH]CUR,[F:SOH]ORDDAT,[F:SOH]UNL, 2, [M]CDTSTA,[M]OST,[M]OSTAUZ) From TRTVENCDT
    Endif
    # End issue 113254
    # --------------------------------------
    # FGR 25/06/2015 : X3SUIVI109125 (début)
    Read [SOH]=
    If dim([L]AUPDTICK) > 0 and dim([F]updTick) > 0 Then
      [L]AUPDTICK = [F:SOH]updTick
    Endif
    # FGR 25/06/2015 : X3SUIVI109125 (fin)
    # --------------------------------------
    
    #---------------------------------------------------------#
    # Lecture Client commande: Alimentation du nom client     #
    #                          Alimentation du montant mini   #
    #                          Alimentation du texte commande #
    #---------------------------------------------------------#
    GBPCNUM = [F:SOH]BPCORD
    Read [BPC]BPC0 = [F:SOH]BPCORD
    If fstat
       Raz [F:BPC]
       Call RSTA("BPC",[F:SOH]BPCORD) From GLOCK
    Endif
    
    # Alimentation à partir du modèle d'édition
    Call ALI_PRTMOD("SOH0",2) From TRTX3
    If [M:SOH0]COPNBR=0 [M:SOH0]COPNBR=1 Endif
    
    If [F:SOH]BPCNAM(0) <> "" [M:SOH0]BPCNAM = [F:SOH]BPCNAM(0)
                         Else [M:SOH0]BPCNAM = [F:BPC]BPCNAM    : Endif
    Call ALIORDMIN([F:SOH]BPCORD, [F:SOH]CUR, [F:SOH]ORDDAT, [M:SOH0]ORDMINAMT) From TRTVENCDE
    #---------------------------------------------------------#
    # Lecture Client livré   : Alimentation du nom client     #
    #---------------------------------------------------------#
    If [F:BPD]BPCNUM<>[F:SOH]BPCORD | [F:BPD]BPAADD<>[F:SOH]BPAADD
       Read [BPD]BPD0 = [F:SOH]BPCORD;[F:SOH]BPAADD
       If fstat Raz [F:BPD]: Call RSTA("BPD",[F:SOH]BPCORD) From GLOCK
                Endif
    Endif
    If [F:SOH]BPDNAM(0) <> "" [M:SOH1]BPDNAM = [F:SOH]BPDNAM(0)
                         Else [M:SOH1]BPDNAM = [F:BPD]BPDNAM    : Endif
    #---------------------------#
    # Alimentation des adresses #
    #---------------------------#
    Raz [M:ADB1], [M:ADB2], [M:ADB3]
    [M:ADB1]BPAADD       = [F:SOH]BPAORD
    [M:ADB1]ADBBPR       = [F:SOH]BPCORD
    [M:ADB1]BPRNAM(0)    = [F:SOH]BPCNAM(0)
    [M:ADB1]BPRNAM(1)    = [F:SOH]BPCNAM(1)
    [M:ADB1]BPAADDLIG(0) = [F:SOH]BPCADDLIG(0)
    [M:ADB1]BPAADDLIG(1) = [F:SOH]BPCADDLIG(1)
    [M:ADB1]BPAADDLIG(2) = [F:SOH]BPCADDLIG(2)
    [M:ADB1]POSCOD       = [F:SOH]BPCPOSCOD
    [M:ADB1]CTY          = [F:SOH]BPCCTY
    [M:ADB1]SAT          = [F:SOH]BPCSAT
    [M:ADB1]CRY          = [F:SOH]BPCCRY
    [M:ADB1]CRYNAM       = [F:SOH]BPCCRYNAM
    [M:ADB1]CNTNAM       = [F:SOH]CNTNAM
    #If [F:SOH]BPCORD = [F:SOH]BPCINV & dim([M:ADB1]EECNUM)>0
    #   [M:ADB1]EECNUM    = [F:SOH]BPIEECNUM
    #Endif
    
    If [M:ADB1]BPRNAM <> "" |  [M:ADB1]BPAADDLIG <> "" |
    &  [M:ADB1]POSCOD <> "" |  [M:ADB1]CTY <> "" |
    &  [M:ADB1]SAT    <> "" |
    &  [M:ADB1]CRY    <> "" |  [M:ADB1]CRYNAM <> ""
        [M:ADB1]ADBFLG = 3
    Else
        [M:ADB1]ADBFLG = 0
    Endif
    
    # Alimentation code adresse (client livré) dans [M:ADB2] pour saisie adresse libre
    If dim([M:ADB2]BPAADD) > 0
        [M:ADB2]BPAADD   = [F:SOH]BPAADD
    Endif
    [M:ADB2]ADBBPR       = [F:SOH]BPCORD
    [M:ADB2]BPRNAM(0)    = [F:SOH]BPDNAM(0)
    [M:ADB2]BPRNAM(1)    = [F:SOH]BPDNAM(1)
    [M:ADB2]BPAADDLIG(0) = [F:SOH]BPDADDLIG(0)
    [M:ADB2]BPAADDLIG(1) = [F:SOH]BPDADDLIG(1)
    [M:ADB2]BPAADDLIG(2) = [F:SOH]BPDADDLIG(2)
    [M:ADB2]POSCOD       = [F:SOH]BPDPOSCOD
    [M:ADB2]CTY          = [F:SOH]BPDCTY
    [M:ADB2]SAT          = [F:SOH]BPDSAT
    [M:ADB2]CRY          = [F:SOH]BPDCRY
    [M:ADB2]CRYNAM       = [F:SOH]BPDCRYNAM
    [M:ADB2]CNTNAM       = [F:SOH]CNDNAM
    #If [F:SOH]BPCORD = [F:SOH]BPCINV & dim([M:ADB2]EECNUM)>0
    #   [M:ADB2]EECNUM    = [F:SOH]BPIEECNUM
    #Endif
    
    If [M:ADB2]BPRNAM <> "" | [M:ADB2]BPAADDLIG <> "" |
    &  [M:ADB2]POSCOD <> "" | [M:ADB2]CTY <> ""      |
    &  [M:ADB2]SAT    <> "" |
    &  [M:ADB2]CRY    <> "" | [M:ADB2]CRYNAM <> ""
        [M:ADB2]ADBFLG = 3
    Else
        [M:ADB2]ADBFLG = 0
    Endif
    
    #LTA.sn
    If dim([M:ADB2]ADRVAL) > 0 and dim([F:SOH]ADRVAL) > 0
        [M:ADB2]ADRVAL = [F:SOH]ADRVAL
    Endif
    Gosub SHOW_HIDE_ENTCOD From TRTADRLIB
    #LTA.en
    
    [M:ADB3]BPAADD       = [F:SOH]BPAINV
    [M:ADB3]ADBBPR       = [F:SOH]BPCINV
    [M:ADB3]BPRNAM(0)    = [F:SOH]BPINAM(0)
    [M:ADB3]BPRNAM(1)    = [F:SOH]BPINAM(1)
    [M:ADB3]BPAADDLIG(0) = [F:SOH]BPIADDLIG(0)
    [M:ADB3]BPAADDLIG(1) = [F:SOH]BPIADDLIG(1)
    [M:ADB3]BPAADDLIG(2) = [F:SOH]BPIADDLIG(2)
    [M:ADB3]POSCOD       = [F:SOH]BPIPOSCOD
    [M:ADB3]CTY          = [F:SOH]BPICTY
    [M:ADB3]SAT          = [F:SOH]BPISAT
    [M:ADB3]CRY          = [F:SOH]BPICRY
    [M:ADB3]CRYNAM       = [F:SOH]BPICRYNAM
    [M:ADB3]CNTNAM       = [F:SOH]CNINAM
    #If dim([M:ADB3]EECNUM)>0
    #   [M:ADB3]EECNUM    = [F:SOH]BPIEECNUM
    #Endif
    If [M:ADB3]BPRNAM <> "" |  [M:ADB3]BPAADDLIG <> "" |
    &  [M:ADB3]POSCOD <> "" |  [M:ADB3]CTY <> ""      |
    &  [M:ADB3]SAT    <> "" |
    &  [M:ADB3]CRY    <> "" |  [M:ADB3]CRYNAM <> ""
        [M:ADB3]ADBFLG = 3
    Else
        [M:ADB3]ADBFLG = 0
    Endif
    #If [M:ADB3]ADBFLG=0                        : # Bug 67868
    If [M:ADB3]ADBFLG=0 & [M:ADB3]BPAADD=""     : # Bug 67868
    #    Aucune adresse chargée pour le client facture
    #    --> Essai de récup. du code adresse dans la fiche client commande
        If [M:SOH1]BPCINV=[F:BPC]BPCINV [M:ADB3]BPAADD=[F:BPC]BPAINV : Endif
    Endif
    # Alimentation pays client livré pour affichage et ctrl n°identification CEE
    
    If [M:ADB2]CRY<>""
        [M:SOH0]EECNUMCRY=[M:ADB2]CRY
    Else
        If [F:BPA]BPATYP<>1 | [F:BPA]BPANUM<>[F:SOH]BPCORD | [F:BPA]BPAADD<>[F:SOH]BPAADD
            Read [BPA]BPA0=1;[F:SOH]BPCORD;[F:SOH]BPAADD
            If fstat Raz [F:BPA] Endif
        Endif
        [M:SOH0]EECNUMCRY=[F:BPA]CRY
    Endif
    
    # X3-101236 (LCC-26/07/18) Control "EU VAT no"
    # The country can be the country of the ship to customer or the country of the bill to customer
    Local Char WDUMMY(20)
    Call INIEECNUM ([M:SOH0]BPCORD,[M:SOH1]BPAADD,[M:SOH1]BPCINV,WDUMMY,[M:SOH0]EECNUMCRY) From TRTVENDIV
    # end X3-101236 (LCC-26/07/18) Control "EU VAT no"
    Raz GREV
    
    If GFONC1="GESSOH" Call RAZ_CLOB From ACLOB Endif
    #---
    # GCONSDIA est positionné en AVTBOUT et dépositionné en STATUT et EXEBOUT
    # Içi c'est trop tôt à cause du bouton supprimer qui utilise GCONSDIA
    # Or la suppress. d'une cde soldée doit être possible !
    #---
    # Pour visu des textes si commande soldée
    #If [F:SOH]ORDSTA=2
    #   GCONSDIA=1
    #Else
    #   GCONSDIA=0
    #Endif
    
    Raz GTARFLG
    GUPDAPPFLG=1
    
    # 94587 : Pb naming convention
    #[M:SOH0]YAPPFLG=[F:SOH]APPFLG  : # Bug 89410
    [M:SOH0]OLDAPPFLG=[F:SOH]APPFLG
    # 94587
    
    # 107890 : Scheduled invoices : (LD:14/01/16)
    If [M:SOH0]SOHCAT=1 & [M:SOH3]VCRINVCNDDAT=[0/0/0]
        [M:SOH3]VCRINVCNDDAT=[M:SOH0]ORDDAT
    Endif
    # 107890 : Scheduled invoices : (LD:14/01/16)
    
    # Chargement des lignes dans le tableau
    Gosub LIENS From TABLEAUX
    
    If dim(GWEBSERV)=1 & GWEBSERV=1
        Raz GWEBFOCITMREF, GWEBFOCQTY, GWEBFOCUOM, GWEBFOCMOTIF, GWEBNBGRA
    
        # Bug 57682
        If !clalev([F:TXC])  Local File TEXCLOB  [TXC] : Endif
        If [M:SOH0]SOHTEX1<>""
          Read [TXC] TXC0=[M:SOH0]SOHTEX1
          If !fstat
            [M:ACL1]CLOB=[F:TXC]TEXTE : [M:ACL1]CLOBSVG=[F:TXC]TEXTE
            Call RANGE_CLOB([F:TXC]TEXTE,[M:SOH0]SOHTEX1,[L]WRET) From ACLOB
            If STAT=1
              Call ERREUR(mess(215,126,1)-"("+num$(GCLOMEM)-"Ko)") From GESECRAN
            Endif
          Endif
        Endif
        If [M:SOH0]SOHTEX2<>""
          Read [TXC] TXC0=[M:SOH0]SOHTEX2
          If !fstat
            [M:ACL2]CLOB=[F:TXC]TEXTE : [M:ACL2]CLOBSVG=[F:TXC]TEXTE
            Call RANGE_CLOB([F:TXC]TEXTE,[M:SOH0]SOHTEX2,[L]WRET) From ACLOB
            If STAT=1
              Call ERREUR(mess(215,126,1)-"("+num$(GCLOMEM)-"Ko)") From GESECRAN
            Endif
          Endif
        Endif
        # Bug 57682
    Endif
    Gosub MANHLD_LIENS From MANHLDLIB  # order holds
    Return
    ####################################################################
    $GRIZE_LIENS
    #------------------------------------------------------------#
    # Activation/Desactivation des zones en fonction du contexte #
    #------------------------------------------------------------#
    
    # FGR 23/11/2011 : X3SUIVI71065 (début)
    If GPJTSNGDOC = G_NON Then
      Call PJT_MODFCY([M:SOH0]SALFCY, "[M:SOH4]DPJT") From TRTPJT
    Endif
    # FGR 23/11/2011 : X3SUIVI71065 (fin)
    # Issue X3-135076 by ANKUL
    If [M:SOH1]ORDSTA = 2
    # Issue X3-135076 end
       Diszo [M:SOH0]1-99
       Diszo [M:SOH1]1-99
       Diszo [M:SOH2]1-99
       # 107888 : Scheduled invoices : (LD:19/12/16)
       #Diszo [M:SOH3]5,15,25
       Diszo [M:SOH3]5,10,15,25
       # 107888 : Scheduled invoices : (LD:19/12/16)
       If dim ([M:SOH3]CCE) > 0
          Diszo [M:SOH3]CCE
       Endif
       # Commande modifiable (uniquement rajout de ligne)
       # si toute les lignes sont associées à des contrats de service
       If find("",[M:SOH4]CONNUM(0..[M:SOH4]NBLIG-1))
          Diszo [M:SOH4]1-99
       Else
          Actzo [M:SOH4]5
          Diszo [M:SOH4]10,15,20
       Endif
       Actzo [M:SOH0]SOHNUM
       Return
    Else
       Actzo [M:SOH0]1-99
       Actzo [M:SOH1]1-99
       Actzo [M:SOH2]1-99
       Actzo [M:SOH3]1-99
       Actzo [M:SOH4]1-99
       Actzo [M:SOH4]DBPAADD, DEMSTA   # FGR 17/02/2014 : X3SUIVI96448 : ça ne les réactive pas sur la première ligne !
    Endif
    
    # 107888 : Scheduled invoices : (LD:27/05/16)
    #If [M:SOH0]SOHCAT = 3
    If [M:SOH0]SOHCAT = 3 | ([M:SOH0]SOHCAT = 1 & sum([M:SOH4]DLVFLG) = [M:SOH4]NBLIG)
        # --> Commande à facturation directe
        # --> Commande normale et aucune ligne livrable
        # On grize les infos livraisons, elles n'ont pas de signification
    # 107888 : Scheduled invoices : (LD:27/05/16)
       Grizo [M:SOH1]DLVSTA
       Grizo [M:SOH2]LASDLVDAT, LASDLVNUM
    Else
       Diszo [M:SOH2]LASDLVNUM
    Endif
    
    # 107890 : Scheduled invoices : (LD:08/12/15)
    # Invoicing condition managed only for Normal order
    If [M:SOH0]SOHCAT<>1
        Diszo [M:SOH3]INVCND
        Diszo [M:SOH3]VCRINVCNDDAT
    Else
        Actzo [M:SOH3]INVCND
        Actzo [M:SOH3]VCRINVCNDDAT
    Endif
    # 107890 : Scheduled invoices : (LD:08/12/15)
    
    If dim([M:SOH1]LNDRTNDAT) > 0 & [M:SOH0]SOHCAT <> 2
       Grizo [M:SOH1]LNDRTNDAT
    Endif
    # Commande inter-site générée à partir d'une commande d'achat
    If [M:SOH1]BETFCY = 2 & [M:SOH0]ORIFCY<>"" & [M:SOH0]ORIFCY<>[M:SOH0]SALFCY
        Diszo [M:SOH0]CUSORDREF
        Diszo [M:SOH1]BPCINV, BPCPYR, BPAADD : # Coe on ne répercute rien sur la cde d'achat, on bloque la modif
        Diszo [M:SOH4]DBPAADD, DEMSTA        : # Coe on ne répercute rien sur la cde d'achat, on bloque la modif
    Endif
    
    If [M:SOH1]BETFCY = 2 & [M:SOH1]BETCPY <= 1 Grizo [M:SOH1]BPCINV, BPCPYR : Endif
    
    # Bug 59281 : En webservice, le n°commande doit tjs être saisissable
    If find (GREP, "C", "D") & GMANCOU=1 & (dim(GWEBSERV)<1 | GWEBSERV=0) Diszo [M:SOH0]SOHNUM : Endif
    
    If GREP <> "C" Diszo [M:SOH0]SOHTYP, SALFCY  : Endif
    If !find (GREP, "C", "D")
        Diszo [M:SOH0]BPCORD
    Endif
    If !find(GREP,"C","D")
        Diszo [M:SOH1]CUR
    Elsif GUPDCUR=1
        Call CONTDEV([M:SOH1]CUR,[M:SOH0]ORDDAT) From TRTDEV
        If !mkstat Diszo [M:SOH1]CUR Endif
        Raz GMESSAGE : mkstat=0
    Endif
    If !find(GREP,"C","D") | GNOTATI=1 Diszo [M:SOH1]PRITYP Endif
    
    If [M:SOH2]DME = 3
    #    Diszo [M:SOH2]STOFCY
        Diszo [M:SOH4]DBPAADD, DSTOFCY, DDLVPIO, DDRN, DMDL, DBPTNUM
    Endif
    If [M:SOH1]DLVSTA > 1
        Diszo [M:SOH1]BPCINV
        Diszo [M:SOH2]ODL, DME
        Diszo [M:SOH3]IME
    Endif
    # Désactivation de la condition de paiement
    # --> Si commande partiellement facturée
    If [M:SOH1]INVSTA > 1 Diszo [M:SOH3]PTE Endif
    If !find(GREP,"C","D")
    # --> Si la commande existe et des acomptes ont été réglés
        Local Integer WOK : WOK=1
        Call ACOMPTES(5,3,[M:SOH0]SOHNUM,[M:SOH4]NBLIG,[M:SOH3]PTE,[M:SOH0]ORDDAT,[M:SOH4]ORDINVNOT,[M:SOH4]ORDINVATI,
    &                [M:SOH0]CUR,0,"","","",1,WOK) From TRTTPT
        If WOK=0 Diszo [M:SOH3]PTE : Raz GMESSAGE, GERR Endif
    Endif
    
    # B13099
    #If find (3, [M:SOH4]SOQSTA(0..[M:SOH4]NBLIG-1)) <> 0
    #   Diszo [M:SOH2]ORDCLE
    #Endif
    
    #If sum([M:SOH4]ALLQTY, [M:SOH4]SHTQTY, [M:SOH4]WALLQTY) <> 0
    If sum([M:SOH4]ALLQTY, [M:SOH4]SHTQTY) <> 0 Diszo [M:SOH2]ALLTYP : Endif
    
    # Issue 112736
    # If we want to import SQHNUM the field has to be enterable
    #Diszo [M:SOH3]PRFNUM,LASINVNUM,SQHNUM
    If !GIMPORT Diszo [M:SOH3]PRFNUM,LASINVNUM,SQHNUM Endif
    # End issue 112736
    
    If GLINREP=1
        If dim([M:SOH4]REP1) > 0 Diszo [M:SOH4]REP1, REPRAT1 Endif
        If dim([M:SOH4]REP2) > 0 Diszo [M:SOH4]REP2, REPRAT2 Endif
    Endif
    If GLINBPD = 1 Diszo [M:SOH4]DBPAADD Endif
    
    If GCDTUNL=1 Diszo [M:SOH2]UNL Endif
    If GPRIMOD=1
        Diszo [M:SOH4]GROPRI
        If dim([M:SOH4]DISCRGVAL1) > 0 Diszo [M:SOH4]DISCRGVAL1 Endif
        If dim([M:SOH4]DISCRGVAL2) > 0 Diszo [M:SOH4]DISCRGVAL2 Endif
        If dim([M:SOH4]DISCRGVAL3) > 0 Diszo [M:SOH4]DISCRGVAL3 Endif
        If dim([M:SOH4]DISCRGVAL4) > 0 Diszo [M:SOH4]DISCRGVAL4 Endif
        If dim([M:SOH4]DISCRGVAL5) > 0 Diszo [M:SOH4]DISCRGVAL5 Endif
        If dim([M:SOH4]DISCRGVAL6) > 0 Diszo [M:SOH4]DISCRGVAL6 Endif
        If dim([M:SOH4]DISCRGVAL7) > 0 Diszo [M:SOH4]DISCRGVAL7 Endif
        If dim([M:SOH4]DISCRGVAL8) > 0 Diszo [M:SOH4]DISCRGVAL8 Endif
        If dim([M:SOH4]DISCRGVAL9) > 0 Diszo [M:SOH4]DISCRGVAL9 Endif
    Endif
    
    If dim([M:SOH4]ORDINVATI)>0 : Diszo [M:SOH4]ORDINVATI : Endif
    
    # FGR 23/11/2011 : X3SUIVI71065 (début)
    If GPJTSNGDOC = G_OUI Then
      Call PJT_MODFCY([M:SOH0]SALFCY, "[M:SOH4]DPJT") From TRTPJT
    Endif
    # FGR 23/11/2011 : X3SUIVI71065 (fin)
    
    # Remise à blc des msgs qu'on aurait pu mettre en bas d'écran (kit non gere en stock par ex)
    GERR=4: GMESSAGE="                                  "
    Gosub MANHLD_LIENS From MANHLDLIB  # order holds
    
    # 78411 Sage Exchange
    If func AFNC.ACTIV("SEPP")
      If func SEPPLIB.SEPP_DOC([M:SOH3]PTE)
        [M:SOH2]ODL = 2 : [M:SOH3]IME = 1
        Affzo [M:SOH2]ODL : Affzo [M:SOH3]IME
        Grizo [M:SOH2]ODL : Grizo [M:SOH3]IME
      Else
        Actzo [M:SOH2]ODL : Actzo [M:SOH3]IME
      Endif
    Endif
    
    Gosub SHOW_HIDE_ENTCOD From TRTADRLIB   #109528.n
    
    #101380
    Call SETUP_SSTFIELDS
    
    Return
    ####################################################################
    $LIENS_LIG
    
    Local Shortint NOL, NLIG
    Local Char     VAT(GLONVAT)(3)
    Local Decimal  WQTY
    #-------------------------------------#
    # Lecture de l'enregistrement SORDERQ #
    #-------------------------------------#
    NOL=nolign-1
    
    # FGR 24/07/2015 : X3SUIVI109796 : Optimisation (début) plus la peine on a fait un link
    #Read [SOQ]SOQ0=[F:SOP]SOHNUM;[F:SOP]SOPLIN;[F:SOP]SOPSEQ
    #If fstat <> 0:Raz [F:SOQ]:Endif
    # FGR 24/07/2015 : X3SUIVI109796 : Optimisation (fin) plus la peine on a fait un link
    #---------------------------------------------------------#
    # Lecture article-vente pour chargement flag ctm          #
    #---------------------------------------------------------#
    # FGR 28/07/2015 : X3SUIVI108078 : Ajout de [F:ITS] (début)
    #If [F:ITS]ITMREF <> [F:SOP]ITMREF
    #     Read [F:ITS]ITS0 = [F:SOP]ITMREF
    #     If fstat  Raz [F:ITS] : Call RSTA ("ITS",[F:SOP]ITMREF) From GLOCK : Endif
    #Endif
    # FGR 28/07/2015 : X3SUIVI108078 : Ajout de [F:ITS] (fin)
    # FGR 10/11/2015 : X3SUIVI108078 (début) TEST [ITS]
    If [F:ITS]ITMREF <> [F:SOP]ITMREF Then
      Call MESSAGE(func AFNC.MES1(mess(435,192,1), [F:SOP]ITMREF)) From GESECRAN
    Endif
    # FGR 10/11/2015 : X3SUIVI108078 (fin) TEST [ITS]
    
    [M:SOH4]CTMFLG(NOL)  =  [F:ITS]CTMFLG        : # Bug 55476
    
    # 107890 : Scheduled invoices : (LD:14/01/16)
    If [M:SOH4]DLVFLG(NOL)=0
        [M:SOH4]DLVFLG(NOL)=[F:ITM]DLVFLG
    Endif
    # 107890 : Scheduled invoices : (LD:14/01/16)
    
    # Bug 55476 : Init. flag géré en stock
    #------------------------------------------------------------#
    # Lecture article pour chargement flag géré en stock origine #
    #------------------------------------------------------------#
    # FGR 24/07/2015 : X3SUIVI109796 : Optimisation (début) plus la peine on a fait un link
    #If [F:ITM]ITMREF <> [F:SOP]ITMREF
    #     Read [F:ITM]ITM0 = [F:SOP]ITMREF
    #     If fstat  Raz [F:ITM] : Call RSTA ("ITM",[F:SOP]ITMREF) From GLOCK : Endif
    #Endif
    # FGR 24/07/2015 : X3SUIVI109796 : Optimisation (fin) plus la peine on a fait un link
    
    [M:SOH4]YSTOMGTCOD(NOL) = [F:ITM]STOMGTCOD
    If [F:ITM]STOMGTCOD>1
        If [F:ITF]ITMREF<>[F:SOP]ITMREF | [F:ITF]STOFCY<>[F:SOP]STOFCY
            Read [ITF] ITF0=[F:SOP]ITMREF;[F:SOP]STOFCY
            If fstat Raz [F:ITF] : Endif
        Endif
        If [F:ITF]STOMGTCOD>0 [M:SOH4]YSTOMGTCOD(NOL) = [F:ITF]STOMGTCOD Endif
    Endif
    
    #---------------------------------------------#
    # Alimentation de l'écran à partir de SORDERP #
    #---------------------------------------------#
    [M:SOH4]DBPAADD(NOL)  =  [F:SOP]BPAADD
    [M:SOH4]VAT1(NOL)     =  [F:SOP]VAT(0)
    [M:SOH4]VAT2(NOL)     =  [F:SOP]VAT(1)
    [M:SOH4]VAT3(NOL)     =  [F:SOP]VAT(2)
    [M:SOH4]VACITM1(NOL)  =  [F:SOP]VACITM(0)
    [M:SOH4]VACITM2(NOL)  =  [F:SOP]VACITM(1)
    [M:SOH4]VACITM3(NOL)  =  [F:SOP]VACITM(2)
    [M:SOH4]DINVCND(NOL)  =  [F:SOP]INVCND     : # 107890 : Scheduled invoices : (LD:08/12/15)
    
    If dim([M:SOH4]SSTCOD(NOL)) >0: [M:SOH4]SSTCOD(NOL)  = [F:SOP]SSTCOD   :Endif #101380.n
    If dim([M:SOH4]TSICOD1(NOL))>0: [M:SOH4]TSICOD1(NOL) = [F:SOP]TSICOD(0):Endif
    If dim([M:SOH4]TSICOD2(NOL))>0: [M:SOH4]TSICOD2(NOL) = [F:SOP]TSICOD(1):Endif
    If dim([M:SOH4]TSICOD3(NOL))>0: [M:SOH4]TSICOD3(NOL) = [F:SOP]TSICOD(2):Endif
    If dim([M:SOH4]TSICOD4(NOL))>0: [M:SOH4]TSICOD4(NOL) = [F:SOP]TSICOD(3):Endif
    If dim([M:SOH4]TSICOD5(NOL))>0: [M:SOH4]TSICOD5(NOL) = [F:SOP]TSICOD(4):Endif
    [M:SOH4]DETSQHNUM(NOL)=  [F:SOP]SQHNUM
    [M:SOH4]WUPDAPPFLG(NOL) = 1
    
    #----- Chargement sections analytiques -----#
    Call CHARG_CCE("SOH4",NOL,"SOP",0,[F:SOP]SOHNUM,[F:SOP]SOPLIN,[F:SOP]SOPSEQ,"") From TRTX3CPT
    #---------------------------------------------#
    # Alimentation de l'écran à partir de SORDERQ #
    #---------------------------------------------#
    [M:SOH4] = [F:SOQ]
    #Endif
    [M]DPJT(NOL)       = [F:SOQ]PJT       : # 71065 : PJT
    [M]DSTOFCY(NOL)    = [F:SOQ]STOFCY
    [M]DDLVPIO(NOL)    = [F:SOQ]DLVPIO
    [M]DBPTNUM(NOL)    = [F:SOQ]BPTNUM
    [M]DMDL(NOL)       = [F:SOQ]MDL
    [M]DDRN(NOL)       = [F:SOQ]DRN
    [M]DDAYLTI(NOL)    = [F:SOQ]DAYLTI
    [M]DDEMDLVDAT(NOL) = [F:SOQ]DEMDLVDAT
    [M]DSHIDAT(NOL)    = [F:SOQ]SHIDAT
    [M]DALLTYP(NOL)    = [F:SOQ]ALLTYP
    [M]DCCLREN(NOL)    = [F:SOQ]CCLREN
    [M]DCCLDAT(NOL)    = [F:SOQ]CCLDAT
    
    [M]GRPFLG(NOL)=1
    # --- Alimentation des zones de sauvegarde
    Raz [M]WIPFLG(NOL)
    [M]YQTY(NOL)       = [M]QTY(NOL)
    [M]CQTY(NOL)       = [M]QTY(NOL)
    [M]YALLQTY(NOL)    = [M]ALLQTY(NOL)
    [M]YSHTQTY(NOL)    = [M]SHTQTY(NOL)
    [M]YSOQSTA(NOL)    = [M]SOQSTA(NOL)
    [M]YDSHIDAT(NOL)   = [M]DSHIDAT(NOL)
    # Issue X3-200515/X3-220171 - 2020-11-18 by SR : Save the prvious net price
    [M]YNETPRI(NOL)    = [M]NETPRI(NOL)
    # End issue X3-200515/X3-220171
    # --- Calcul du total alloué
    [M]TALLQTYSTU(NOL) = [F:SOQ]ALLQTYSTU + [F:SOQ]ODLQTYSTU + [F:SOQ]OPRQTYSTU + [F:SOQ]PREQTYSTU
    [M]TALLQTY(NOL)    = [F:SOQ]ALLQTY + [F:SOQ]ODLQTY + [F:SOQ]OPRQTY + [F:SOQ]PREQTY
    # 107888 : Scheduled invoices : (LD:19/05/16)
    #If [M:SOH0]SOHCAT = 3
    If [M:SOH0]SOHCAT = 3 | [M]DLVFLG(NOL)=1
    # Commande à facturation directe
    # Commande normale et ligne non livrable
    # 107888 : Scheduled invoices : (LD:19/05/16)
        [M]TALLQTYSTU(NOL) += [F:SOQ]INVQTYSTU
        [M]TALLQTY(NOL)    += [F:SOQ]INVQTY
    Else
        [M]TALLQTYSTU(NOL) += [F:SOQ]DLVQTYSTU
        [M]TALLQTY(NOL)    += [F:SOQ]DLVQTY
    Endif
    # --- Qté à allouer = Qté déjà allouée
    [M]WALLQTY(NOL)    = [F:SOQ]ALLQTY + [F:SOQ]SHTQTY
    [M]WALLQTYSTU(NOL) = [F:SOQ]ALLQTYSTU + [F:SOQ]SHTQTYSTU
    
    Gosub CALC_DLBQTYSTU
    
    #---------------------------------------------#
    # Calcul du montant  HT et TTC de la ligne    #
    # Calcul du mnt à liv HT et TTC de la ligne   #
    #---------------------------------------------#
    VAT (0)     =  [F:SOP]VAT(0)
    VAT (1)     =  [F:SOP]VAT(1)
    VAT (2)     =  [F:SOP]VAT(2)
    NLIG=NOL : Gosub CALC_ORD From SUBSOHB
    
    If [F:SOQ]DEMSTA = 1 Gosub CALC_DLR From SUBSOHB : Endif
    
    # V6 Règle affectation
    If dim([M:SOH4]PTOCOD)>0
       [M:SOH4]PTOCOD(NOL) = func ITMLIB.GET_PTOCOD([M:SOH4]ITMREF(NOL),[M:SOH4]DSTOFCY(NOL))
    Endif
    
      # FGR 13/02/2014 : X3SUIVI96419 (début) : on mémorise tous les contrats de la commande
      If [M:SOH4]CONNUM(NOL) <> "" Then
        [M:SOH0]CONUMDEL([M:SOH0]NBCON)  = [M:SOH4]CONNUM(NOL)
        [M:SOH0]CONNUMLIG([M:SOH0]NBCON) = [M:SOH4]SOPLIN(NOL)
        [M:SOH0]NBCON += 1
      Endif
      # FGR 13/02/2014 : X3SUIVI96419 (fin)
    # Issue X3-200515/X3-208171 - 2020-09-07 by SR : Progress billing : Calculation of the minimum amount
    If dim([M:SOH4]PRGBILNUM) > 0 & [M:SOH4]PRGBILNUM(NOL) <> ""
    
      # 200515 : Progress billing / X3-217059 : Blocking control modification on price structure updates on sales order line - 2020-10-06 by LD
    
      #[M:SOH4]WPRGMINAMT(NOL) = func LIBSAL_INVCND_SOH.C_AMT_PRGBILNUM([F:SOQ]INVAMT,[M:SOH4]PRGBILNUM(NOL))
      #[M:SOH4]WPRGMINAMT(NOL) = arr([M:SOH4]WPRGMINAMT(NOL), 10^-GDECPRI)
    
      # The amount line can't be less than the scheduled invoices already invoiced amount
      [M:SOH4]WPRGMINAMT(NOL) = [F:SOQ]INVAMT
    
      # Init working flag that indicates if, for the sales order line, there is scheduled invoices linked to a billing situation not invoiced
      # PJM is activated and the sales order line is linked to a billing plan
      [M:SOH4]PBILDTOINV(NOL)=1
      If func LIBSAL_INVCND_SOH.VERF_SVICD_PRGBILINV([M:SOH0]SOHNUM,[M]SOPLIN(NOL),[M]SOPLIN(NOL),GMESSAGE) = [V]CST_AERROR
        # [V]CST_AERROR if there is at least one scheduled invoices linked to a billing situation not invoiced
        [M:SOH4]PBILDTOINV(NOL)=2
      Endif
    Elsif dim([M:SOH4]PRGBILNUM) > 0
      [M:SOH4]PBILDTOINV(NOL)=1
      # 200515 : Progress billing / X3-217059 : Blocking control modification on price structure updates on sales order line - 2020-10-06 by LD
    Endif
    # End issue X3-200515/X3-208171
    
    Return
    
    $CALC_DLBQTYSTU
    #------------------------------------------------------------------------#
    # Si kit : Calcul de la qté livrable au niveau du kit                    #
    #------------------------------------------------------------------------#
    Raz [M]DLBQTYSTU (NOL)
    # Si kit/sous-traité, sauvegarde de l'indice du kit et de la qté cdée pour calcul qté livrable
    If find([M]LINTYP(NOL),2,10)
        Local Integer WKIT_NOL     : WKIT_NOL=NOL
        Local Decimal WKIT_QTYSTU  : Raz WKIT_QTYSTU
    #    If [M]STOMGTCOD(NOL)=1 & [M]ALLQTYSTU(NOL)<>0
        If [M]ALLQTYSTU(NOL)<>0
            WKIT_QTYSTU=[M]QTYSTU(NOL)
            [M]DLBQTYSTU(NOL)=[M]ALLQTYSTU(NOL)
        Endif
    Endif
    # Si composant de kit/sous-traité en rupture, calcul de la qté livrable pour le kit
    # --- Qté livrable = Qté allouée du kit - Qté Rupture ramenée au niveau kit
    If find([M]LINTYP(NOL), 3,4,5,11,12,13) & dim(WKIT_QTYSTU)>0 & WKIT_QTYSTU<>0 & [M]SHTQTYSTU(NOL)>0
        Local Decimal WRAPPORT : WRAPPORT=WKIT_QTYSTU / [M]QTYSTU(NOL)
        Local Decimal WDLBQTYSTU : WDLBQTYSTU=[M]WALLQTYSTU(WKIT_NOL)-arr([M]SHTQTYSTU(NOL)*WRAPPORT,0.000001)
        If WDLBQTYSTU<[M]DLBQTYSTU(WKIT_NOL) [M]DLBQTYSTU(WKIT_NOL)=WDLBQTYSTU Endif
    Endif
    Return
    
    ####################################################################
    $INICRE_LIG
    Local Shortint NOL : NOL=nolign-1
    #--------------------------------#
    # Avant le Write de la ligne SOP #
    #--------------------------------#
    Raz [F:SOQ]
    
    [F:SOP]SOHNUM    =  [M:SOH0]SOHNUM
    [F:SOP]SOPSEQ    =  [F:SOP]SOPLIN
    [F:SOP]ENDDAT    =  [F:SOH]ORDDAT
    [F:SOP]SOHCAT    =  [F:SOH]SOHCAT
    [F:SOP]SALFCY    =  [F:SOH]SALFCY
    [F:SOP]BPCINV    =  [F:SOH]BPCINV
    [F:SOP]BPCORD    =  [M:SOH0]BPCORD
    [F:SOP]LINREVNUM =  [M:SOH0]REVNUM
    [F:SOQ]DSPWEU    =  [M:SOH0]DSPWEU
    [F:SOQ]DSPVOU    =  [M:SOH0]DSPVOU
    
    Gosub CHARGESOP
    
    # En Import, permet la maj des champs affichés et invisibles
    If GIMPORT & dim(G_TRTIMPORT)>0
        # A ne pas effectuer pour les lignes générées automatiquement
        If (find([M]LINTYP(NOL),1,2,6,10) & [M]FOCFLG(NOL)<>3) Gosub ACTION From =G_TRTIMPORT : Endif
    Endif
    
    Return
    ####################################################################
    $INICRE_SOQ
    #--------------------------------#
    # Avant le Write de la ligne SOQ #
    #--------------------------------#
    
    ## --> Il faut raz les zones non gérées à l'écran (pour la dupplication)
    #Raz [F:SOQ]SDHNUM,[F:SOQ]SDDLIN      : # N° et ligne livraison
    #Raz [F:SOQ]DEMNUM                    : # N° ordre
    #Raz [F:SOQ]DLVQTYSTU, [F:SOQ]ODLQTYSTU, [F:SOQ]INVQTYSTU
    #Raz [F:SOQ]FMILIN, [F:SOQ]FMISEQ
    #Raz [F:SOQ]POHNUM, [F:SOQ]POQSEQ
    #Raz [F:SOQ]    : # (LD-30/03/04-Bug 21944)
    
    [F:SOQ]BPCORD    =  [F:SOP]BPCORD
    [F:SOQ]ITMREF    =  [F:SOP]ITMREF
    [F:SOQ]ORDDAT    =  [F:SOH]ORDDAT
    [F:SOQ]SALFCY    =  [F:SOH]SALFCY
    [F:SOQ]SOHCAT    =  [F:SOH]SOHCAT
    [F:SOQ]CREUSR    =  [F:SOP]CREUSR
    [F:SOQ]CREDAT    =  [F:SOP]CREDAT
    [F:SOQ]INVFLG    =  1
    [F:SOQ]ORIQTY    =  [M:SOH4]QTY(NOL)
    
    Gosub CHARGESOQ
    
    [F:SOQ]SOHNUM    =  [F:SOP]SOHNUM
    [F:SOQ]SOPLIN    =  [F:SOP]SOPLIN
    [F:SOQ]SOQSEQ    =  [F:SOP]SOPSEQ
    
    Return
    ####################################################################
    $INIMOD_LIG
    #----------------------------------#
    # Avant le Rewrite de la ligne SOP #
    #----------------------------------#
    [F:SOP]SOHCAT    =  [F:SOH]SOHCAT
    [F:SOP]SALFCY    =  [F:SOH]SALFCY
    [F:SOP]BPCINV    =  [F:SOH]BPCINV
    
    Gosub CHARGESOP
    
    # En Import, permet la maj des champs affichés et invisibles
    If GIMPORT & dim(G_TRTIMPORT)>0
        # A ne pas effectuer pour les lignes générées automatiquement
        If (find([M]LINTYP(NOL),1,2,6,10) & [M]FOCFLG(NOL)<>3) Gosub ACTION From =G_TRTIMPORT : Endif
    Endif
    
    Return
    ####################################################################
    $INIMOD_SOQ
    #---------------------------------#
    # Avant le Rewrite du fichier SOQ #
    #---------------------------------#
    [F:SOQ]ORDDAT    = [F:SOH]ORDDAT
    [F:SOQ]SALFCY    = [F:SOH]SALFCY
    [F:SOQ]SOHCAT    = [F:SOH]SOHCAT
    [F:SOQ]UPDUSR    = [F:SOP]UPDUSR
    [F:SOQ]UPDDAT    = [F:SOP]UPDDAT
    Gosub CHARGESOQ
    Return
    ####################################################################
    $VALLIG
    #---------------------------------------------------#
    # Traitements complementaires effectués à la ligne  #
    # SIGN   vaut +1 en création / modification         #
    #             -1 en annulation                      #
    # TRTLIG vaut "C","M","A" en créa, modif, annule    #
    # l'enregistrement "ligne" est en ligne             #
    #---------------------------------------------------#
    Local Char    WTRTORD
    Local Integer NOL : NOL=nolign-1
    Local Integer WRET : WRET = 0
    # --> Annulation
    
    If    SIGN = -1 & TRTLIG = "A"
        #----- Suppression comptes et sections de la ligne de commande -----#
        Call ENREG_ACCCCE(0,"","","","SOP",0,[F:SOP]SOHNUM,[F:SOP]SOPLIN,[F:SOP]SOPSEQ,"","A") From TRTX3CPT
        If GOK<1  Return : Endif
        #-----
        Gosub LECLIG_SOQ : If GOK < 1 Return : Endif
        Gosub SUPLIG_SOQ : If GOK < 1 Return : Endif
        Gosub SUPLIG_SQD From TRTVENCDE
        Gosub RAZFMIMFG
        Gosub RAZFMIPOH : # VPO 02/07/09 54983
        Gosub VALLIG_INVCND_A From LIBSAL_INVCND_SOH # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    # --> Modification
    Elsif SIGN = -1 & TRTLIG = "M"
        Gosub LECLIG_SOQ
        Gosub VALLIG_INVCND_M_BEFORE From LIBSAL_INVCND_SOH # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    Elsif SIGN = +1 & TRTLIG = "M"
        Gosub INIMOD_SOQ : If GOK < 1 Return : Endif
        # 96173 : Import commande avec n°lot : Le n°lot est maj après l'allocation donc trop tard
        # La maj des chps affichés/invisibles doit se faire avant toute maj
        # En Import, permet la maj des champs affichés et invisibles
        If GIMPORT & dim(G_TRTIMPORT)>0
            # A ne pas effectuer pour les lignes générées automatiquement
            If (find([M]LINTYP(NOL),1,2,6,10) & [M]FOCFLG(NOL)<>3) Gosub ACTION From =G_TRTIMPORT : Endif
        Endif
        # 96173
        Gosub MODLIG_SQD From TRTVENCDE
        #----- Ecriture des sections de la ligne de commande -----#
        Call ENREG_ACCCCE(nolign-1,"","","[M:SOH4]CCE","SOP",
    &                     0,[F:SOP]SOHNUM,[F:SOP]SOPLIN,[F:SOP]SOPSEQ,"",TRTLIG) From TRTX3CPT
        Gosub VALLIG_INVCND_M_AFTER From LIBSAL_INVCND_SOH # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
     # --> Création
    Elsif SIGN = +1 & TRTLIG = "C"
        Gosub INICRE_SOQ : If GOK < 1 Return : Endif
        # 96173 : Import commande avec n°lot : Le n°lot est maj après l'allocation donc trop tard
        # La maj des chps affichés/invisibles doit se faire avant toute maj
        # En Import, permet la maj des champs affichés et invisibles
        If GIMPORT & dim(G_TRTIMPORT)>0
            # A ne pas effectuer pour les lignes générées automatiquement
            If (find([M]LINTYP(NOL),1,2,6,10) & [M]FOCFLG(NOL)<>3) Gosub ACTION From =G_TRTIMPORT : Endif
        Endif
        # 96173
        Gosub CRELIG_SQD From TRTVENCDE
        #----- Ecriture des sections de la ligne de commande -----#
        Call ENREG_ACCCCE(nolign-1,"","","[M:SOH4]CCE","SOP",
    &                     0,[F:SOP]SOHNUM,[F:SOP]SOPLIN,[F:SOP]SOPSEQ,"",TRTLIG) From TRTX3CPT
        Gosub VALLIG_INVCND_C From LIBSAL_INVCND_SOH # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    Endif
    If GOK < 1 Return : Endif
    Raz WRET
    If TRTLIG = "A" | SIGN = +1
      Gosub GENALLORD : If WRET = 1 GOK = 0 Endif
    Endif
    If GOK < 1 Return : Endif
    
      # -------------------------------------------------
      # Issue X3-31898 - 2017-11-23 by FGR : BEGIN : Moved here, before SOQ is updated
      If func ASYRFNC.ACTIV("PJM") Then
        Local Integer IPJMRET
        Local Integer IPJMIDX
        Local Char SMESS(250)
        Local Integer IRET
        # Issue X3-87427 - 2018-04-17 by SR : Renaming WALLSTU in WPJMALLSTU
        Local Char SOPPNUM(GLONPIM)   # Issue X3-221202 - 2020-12-22 by FGR
        Local Char SPBUCOD(GLONPBU)   # Issue X3-221202 - 2020-12-22 by FGR
        Local Char STASCOD(GLONTAC)   # Issue X3-221202 - 2020-12-22 by FGR
        Local Decimal WPJMALLSTU
    
        If (TRTLIG = "C" and SIGN = 1) or
    &      (TRTLIG = "M") or
    &      (TRTLIG = "A" and SIGN = -1)
    &   Then
          If dim(ZPJMSOQQTY) < 0 Then
            Local Instance ZPJMSOQQTY Using C_TECSOQITM
          Endif
          If ZPJMSOQQTY = null Then
            ZPJMSOQQTY = NewInstance C_TECSOQITM AllocGroup null
          Endif
          If TRTLIG = "M" and SIGN = -1 Then
            # To decrease on previous project
            # Issue X3-221202 - 2020-12-22 by FGR : BEGIN
    #        If [M:SOH4]DPJT(NOL) <> AVOID.ACHAR and
    #&          find(func PIMPL_CSTD_PROGS.GET_PIMTYP_VALUE(ZPJMSOQQTY.ACTX, [M:SOH4]DPJT(NOL), AVOID.ACHAR, AVOID.ACHAR, SMESS),6,7) and
    #&          [F:SOQ]PJT <> [M:SOH4]DPJT(NOL)
    #&       Then
            If [M:SOH4]DPJT(NOL) <> AVOID.ACHAR and
    &          find(func PIMPL_CSTD_PROGS.GET_VALUE(ZPJMSOQQTY.ACTX, "PIMTYP", [M:SOH4]DPJT(NOL)),6,7) and
    &          [F:SOQ]PJT <> [M:SOH4]DPJT(NOL)
    &       Then
            # Issue X3-221202 - 2020-12-22 by FGR : END
              # When changing PJT value (including when was empty) to another one
              IPJMRET = fmet ZPJMSOQQTY.SOQ_ADD_LINE([F:SOQ]PJT, [F:SOQ]ITMREF, [M:SOH0]SOHNUM, [F:SOQ]SOPLIN, [F:SOQ]SOQSEQ, IPJMIDX)
              If IPJMRET >= [V]CST_AERROR Then
                # TODO FLORENT ICI prevoir gestion erreur
              Endif
              # Issue X3-87427 - 2018-04-17 by SR : Renaming WALLSTU in WPJMALLSTU
              # Issue X3-221202 - 2020-12-22 by FGR : BEGIN
              #IRET = func PJMTSKITM_CSTD_PROGS.GET_ALLQTY_VALUE(GACTX, [M:SOH4]DPJT(NOL), AVOID.ACHAR, [M:SOH4]ITMREF(NOL), WPJMALLSTU, SMESS)
              IRET = func PIMPL_CSTD_PROGS.PJM_KEY_SPLIT(GACTX, [M:SOH4]DPJT(NOL), SOPPNUM, SPBUCOD, STASCOD)
              WPJMALLSTU = func PJMTSKITM_CSTD_PROGS.GET_VALUE(GACTX, "ALLQTY", SOPPNUM, STASCOD, func PJMTSKITM_CSTD_PROGS.GET_ITTSEQ_FROM_ITMREF(GACTX, SOPPNUM, STASCOD, [M:SOH4]ITMREF(NOL)))
              # Issue X3-221202 - 2020-12-22 by FGR : END
              If [M:SOH4]ALLQTYSTU(NOL) > 0 and WPJMALLSTU <> 0 Then
                # To be able to transfert alloc, we have first deallocate current line
                Call GENALLORD("","","A", 1, 1, 0, [F:SOQ]ALLQTYSTU, [F:SOQ]SHTQTYSTU, WRET) From TRTVENALL
                If WRET <> 0 Then
                  Return
                Endif
                [M:SOH4]ALLQTYSTU(NOL) = 0
                [M:SOH4]ALLQTY(NOL) = 0
                [M:SOH4]SHTQTYSTU(NOL) = 0
                [M:SOH4]SHTQTY(NOL) = 0
              Endif
            # Issue X3-221202 - 2020-12-22 by FGR : BEGIN
    #        Elsif [F:SOQ]PJT <> AVOID.ACHAR and
    #&          find(func PIMPL_CSTD_PROGS.GET_PIMTYP_VALUE(ZPJMSOQQTY.ACTX, [F:SOQ]PJT, AVOID.ACHAR, AVOID.ACHAR, SMESS),6,7) and
    #&         [F:SOQ]PJT <> [M:SOH4]DPJT(NOL)
    #&       Then
            Elsif [F:SOQ]PJT <> AVOID.ACHAR and
    &          find(func PIMPL_CSTD_PROGS.GET_VALUE(ZPJMSOQQTY.ACTX, "PIMTYP", [F:SOQ]PJT),6,7) and
    &         [F:SOQ]PJT <> [M:SOH4]DPJT(NOL)
    &       Then
            # Issue X3-221202 - 2020-12-22 by FGR : END
              # When changing a PJT value to become empty
              IPJMRET = fmet ZPJMSOQQTY.SOQ_ADD_LINE([F:SOQ]PJT, [F:SOQ]ITMREF, [M:SOH0]SOHNUM, [F:SOQ]SOPLIN, [F:SOQ]SOQSEQ, IPJMIDX)
              If IPJMRET >= [V]CST_AERROR Then
                # TODO FLORENT ICI prevoir gestion erreur
              Endif
            Endif
    
            # 200515 : Progress billing / X3-199480 : Billing plan update when the sales order lines is updated (quantity or price) (*)  - 2020-07-27 by LD
            # Update situation lines when a sales order line is updated
            # Only if the sales order line is linked to a billing plan, if the quantity or the net price are modified
            # Issue X3-200515/227027 - 2020-12-18 by MUARN : general tour without PJM
            If dim([M:SOH4]PRGBILNUM) > 0 & [M:SOH4]PRGBILNUM(NOL)<>"" & ([F:SOQ]QTY <> [M:SOH4]QTY(NOL) | [F:SOP]NETPRI <> [M:SOH4]NETPRI(NOL))
              # First the technical class TECPROBIL is fed with the billing plan to update
              If dim(ZPJMTECPROBIL) < 0 Then
                Local Instance ZPJMTECPROBIL Using C_TECPROBIL
              Endif
              If ZPJMTECPROBIL = null Then
                ZPJMTECPROBIL = NewInstance C_TECPROBIL AllocGroup null
              Endif
              IPJMRET = fmet ZPJMTECPROBIL.PBIL_ADD_LINE_REFRESH([M:SOH4]PRGBILNUM(NOL))
              IRET= func SYRSTACKTOOLS.MSGSTACK_GET_FIRST_UPPER_MESSAGE(ZPJMTECPROBIL, SMESS)
              If IRET > 1 & IRET < [V]CST_AERROR
                  GMESSAGE = SMESS
                  GERR = 2
              Elsif IRET
                  GMESSAGE = SMESS
                  GOK = 0
                  GERR = 1
              Endif
              If GOK < 1 Return : Endif
            Endif
            # 200515 : Progress billing / X3-199480 : Billing plan update when the sales order lines is updated (quantity or price) (*)  - 2020-07-27 by LD
    
          Elsif (TRTLIG = "M" and SIGN = 1) or (TRTLIG <> "M") Then
            IPJMRET = fmet ZPJMSOQQTY.SOQ_ADD_LINE([F:SOQ]PJT, [F:SOQ]ITMREF, [M:SOH0]SOHNUM, [F:SOQ]SOPLIN, [F:SOQ]SOQSEQ, IPJMIDX)
            If IPJMRET >= [V]CST_AERROR Then
              # TODO FLORENT ICI prevoir gestion erreur
            Endif
          Endif
        Endif
        If GREP = "M" and TRTLIG = "A" and SIGN = -1 Then
          # Only for deleted lines.
          If dim(ZPJMPSO) < 0 Then
            Local Instance ZPJMPSO Using C_TECPSO
          Endif
          If ZPJMPSO = null Then
            ZPJMPSO = NewInstance C_TECPSO AllocGroup null
          Endif
          IPJMRET = fmet ZPJMPSO.PSO_ADD_LINE("SOH", [M:SOH0]SOHNUM, [F:SOQ]SOQPSONUM, [F:SOQ]SOQSEQNUM)
          If IPJMRET >= [V]CST_AERROR Then
            # TODO FLORENT ICI prevoir gestion erreur
          Endif
        Endif
      Endif
      # Issue X3-31898 - 2017-11-23 by FGR : END
      # -------------------------------------------------
    
    # Maj de l'encours article (Table ORDERS) et des mouvements article (Table ITMMVT)
    # Si cde signée ou Si Paramètre maj encours article cde non signée à "Oui"
    # ou Si cde passe de signée/partiellement signée à non signée (et ds ce cas c'est une suppression)
    #If [F:SOH]APPFLG>2 | GSOHAPPORD=2 | ([F:SOH]APPFLG=0 & TRTLIG="M" & (SIGN=-1 & [M]WIPFLG(nolign-1)="A"))
    If [F:SOH]APPFLG>2 | GSOHAPPORD=2 | ([F:SOH]APPFLG=0 & ((TRTLIG="M" & [M]WIPFLG(nolign-1)="A") | TRTLIG="A"))
        Gosub MAJITV    From SUBSOHA1 : If GOK<1 Return : Endif
        Gosub MAJORDERS From SUBSOHA1 : If GOK<1 Return : Endif
    Endif
    
    # 96173 : Import commande avec n°lot : Le n°lot est maj après l'allocation donc trop tard
    # La maj des chps affichés/invisibles doit se faire avant toute maj
    ## En Import, permet la maj des champs affichés et invisibles
    #If GIMPORT & dim(G_TRTIMPORT)>0
    #    # A ne pas effectuer pour les lignes générées automatiquement
    #    If (find([M]LINTYP(NOL),1,2,6,10) & [M]FOCFLG(NOL)<>3) Gosub ACTION From =G_TRTIMPORT : Endif
    #Endif
    # 96173
    
    # --> Création et modification apres passage dans le moteur d'allocation
    If SIGN = +1
        If TRTLIG = "C" Gosub CRELIG_SOQ : Endif
        If TRTLIG = "M" Gosub MODLIG_SOQ : Endif
    #    Raz [M]WALLQTY(NOL), [M]WALLQTYSTU(NOL)
    Endif
    
      # -------------------------------------------------
      # Issue X3-31898 - 2017-11-23 by FGR : BEGIN
      ## Issue X3-18442/120906 - 2017-01-13 by FGR : BEGIN
      #If func ASYRFNC.ACTIV("PJM") Then
      #  Local Integer IPJMRET
      #  If dim(ZPJMSOQQTY) < 0 Then
      #    Local Instance ZPJMSOQQTY Using C_TECSOQITM
      #  Endif
      #  If ZPJMSOQQTY = null Then
      #    ZPJMSOQQTY = NewInstance C_TECSOQITM AllocGroup null
      #  Endif
      #  #IPJMRET = fmet ZPJMSOQQTY.SOQ_ADD_LINE([F:SOQ]PJT, [F:SOQ]ITMREF)                                            # Issue X3-31898 - 2017-11-17 by FGR
      #  IPJMRET = fmet ZPJMSOQQTY.SOQ_ADD_LINE([F:SOQ]PJT, [F:SOQ]ITMREF, [F:SOQ]SOHNUM, [F:SOQ]SOPLIN, [F:SOQ]SOQSEQ)# Issue X3-31898 - 2017-11-17 by FGR
      #  If IPJMRET >= [V]CST_AERROR Then
      #    # TODO FLORENT ICI prevoir gestion erreur
      #  Endif
      #  # Issue X3-8085/121537 - 2017-02-15 by FGR : BEGIN
      #  If GREP = "M" and TRTLIG = "A" and SIGN = -1 Then
      #    # Only for deleted lines.
      #    If dim(ZPJMPSO) < 0 Then
      #      Local Instance ZPJMPSO Using C_TECPSO
      #    Endif
      #    If ZPJMPSO = null Then
      #      ZPJMPSO = NewInstance C_TECPSO AllocGroup null
      #    Endif
      #    IPJMRET = fmet ZPJMPSO.PSO_ADD_LINE("SOH", [M:SOH0]SOHNUM, [F:SOQ]SOQPSONUM, [F:SOQ]SOQSEQNUM)
      #    If IPJMRET >= [V]CST_AERROR Then
      #      # TODO FLORENT ICI prevoir gestion erreur
      #    Endif
      #  Endif
      #  # Issue X3-8085/121537 - 2017-02-15 by FGR : END
      #Endif
      ## Issue X3-18442/120906 - 2017-01-13 by FGR : END
      # Issue X3-31898 - 2017-11-23 by FGR : END
      # -------------------------------------------------
    Return
    
    ####################################################################
    $RAZFMIMFG
    # --------------------------------------------------- #
    # Si contremarque de production, mises à jour de l'OF #
    # --------------------------------------------------- #
    If [F:SOQ]FMI = 5 & [F:SOQ]FMINUM<> ""
       # Call RAZFMIMFG([F:SOQ]FMINUM, [F:SOQ]FMILIN, WRET) From MFGAUTLIB : # GH 06/07/2012 bug 83344
       Call RAZFMISCO([F:SOQ]FMINUM, [F:SOQ]FMILIN, WRET) From SCOAUTLIB
       If WRET<0
          WRET=0
          Call RAZFMIMFG([F:SOQ]FMINUM, [F:SOQ]FMILIN, WRET) From MFGAUTLIB
       Endif
    Endif
    Return
    ####################################################################
    $RAZFMIPOH
    # VPO 02/07/09 54983
    # --------------------------------------------------- #
    # Si contremarque achat, mises à jour de la commande  #
    # --------------------------------------------------- #
    If find([F:SOQ]FMI,2,3) & [F:SOQ]FMINUM<> ""
        Call RAZFMIPOH([F:SOQ]FMINUM, [F:SOQ]FMILIN, [F:SOQ]FMISEQ, WRET) From TRTACHCDE1
    Endif
    Return
    
    ####################################################################
    $GENALLORD
    Local Decimal WQTY, WALL, WSHT, WALLSTU, WSHTSTU, WQTYSTU
    Local Decimal WSTUDIS, WALLCPS
    Local Char    WTRTLIG    :    WTRTLIG=TRTLIG
    Local Integer WUSERERBPC, WGENSHT, WALLPAR
    Local Char    WSHIDAT
    Local Char SMESS(250)        # Issue X3-31898 - 2017-11-23 by FGR
    Local Integer IRET           # Issue X3-31898 - 2017-11-23 by FGR
    Local Char SOPPNUM(GLONPIM)  # Issue X3-221202 - 2020-12-22 by FGR
    
    # Issue X3-248115 - 2021-05-28 by FGR : BEGIN
    #Local Char SPBUCOD(GLONPBU)  # Issue X3-221202 - 2020-12-22 by FGR
    #Local Char STASCOD(GLONTAC)  # Issue X3-221202 - 2020-12-22 by FGR
    If dim(GLONPBU) >= 0 Then
      Local Char SPBUCOD(GLONPBU)
    Else
      Local Char SPBUCOD(GLONVCR)
    Endif
    If dim(GLONTAC) >= 0 Then
      Local Char STASCOD(GLONTAC)
    Else
      Local Char STASCOD(GLONVCR)
    Endif
    # Issue X3-248115 - 2021-05-28 by FGR : END
    
    If TRTLIG = "A"
    #    Suppression d'une ligne
        If [F:SOQ]ALLQTYSTU <> 0 | [F:SOQ]SHTQTYSTU <> 0
            Call GENALLORD("","","A", 1, 1, 0, [F:SOQ]ALLQTYSTU, [F:SOQ]SHTQTYSTU, WRET) From TRTVENALL
            If WRET <> 0 Return : Endif
        Endif
    Else
    #    Création ou modification d'une ligne
      # Issue X3-31898 - 2017-11-23 by FGR : BEGIN
      # Issue X3-221202 - 2020-12-22 by FGR : BEGIN
    #  If [M:SOH4]DPJT(NOL) <> AVOID.ACHAR and
    #&    find(func PIMPL_CSTD_PROGS.GET_PIMTYP_VALUE(GACTX, [M:SOH4]DPJT(NOL), AVOID.ACHAR, AVOID.ACHAR, SMESS),6,7)
    #& Then
    #    IRET = func PJMTSKITM_CSTD_PROGS.GET_ALLQTY_VALUE(GACTX, [M:SOH4]DPJT(NOL), AVOID.ACHAR, [M:SOH4]ITMREF(NOL), WALLSTU, SMESS)
    #    If WALLSTU <> 0 Then
    #      Return
    #    Endif
    #  Endif
      # Issue X3-31898 - 2017-11-23 by FGR : END
      If [M:SOH4]DPJT(NOL) <> AVOID.ACHAR and find(func PIMPL_CSTD_PROGS.GET_VALUE(GACTX, "PIMTYP", [M:SOH4]DPJT(NOL)),6,7) Then
        IRET = func PIMPL_CSTD_PROGS.PJM_KEY_SPLIT(GACTX, [M:SOH4]DPJT(NOL), SOPPNUM, SPBUCOD, STASCOD)
        If STASCOD <> AVOID.ACHAR Then     # Issue X3-248115 - 2021-05-28 by FGR
          WALLSTU = func PJMTSKITM_CSTD_PROGS.GET_VALUE(GACTX, "ALLQTY", SOPPNUM, STASCOD, func PJMTSKITM_CSTD_PROGS.GET_ITTSEQ_FROM_ITMREF(GACTX, SOPPNUM, STASCOD, [M:SOH4]ITMREF(NOL)))
          If WALLSTU <> 0 Then
            Return
          Endif
        Endif                              # Issue X3-248115 - 2021-05-28 by FGR
      Endif
      # Issue X3-221202 - 2020-12-22 by FGR : END
    
        If [M]WALLQTYSTU (NOL) - ([M]ALLQTYSTU(NOL)+[M]SHTQTYSTU(NOL)) = 0
    # ----- Il n'y a pas de nouvelle allocation,  ni de modif de la date d'expédition
            If [M]SHTQTYSTU(NOL)=0 & [M]ALLQTYSTU(NOL)=0 & ([M]DSHIDAT(NOL)=[M]YDSHIDAT(NOL)) Return Endif
            # Issue 73816 : No allocation if credit limit exceeded during order creation/modification
            If [M]SHTQTYSTU(NOL)<>0 & OSTNEW > [M:SOH0]OSTAUZ & GCDTUNL=1 Return Endif
            If [M]SHTQTYSTU(NOL)<>0
    # --------- Il y avait de la rupture : On essaie de réallouer la qté en rupture
                WTRTLIG = "M"
                WALLSTU = 0 : WALLCPS = 0
                WSHTSTU = [M]SHTQTYSTU (NOL)
                #---------------------------------------------------------------------#
                # Point d'entree pour ne pas réallouer les ruptures                   #
                #---------------------------------------------------------------------#
                GPOINT="SOHSHTALL" : Gosub ENTREE From EXEFNC
                If WSHTSTU = 0 Return Endif
            Elsif [M]DSHIDAT(NOL)<>[M]YDSHIDAT(NOL)
    # --------- La date d'expédition a été modifiée : Répercution sur les allocations existante
                WSHIDAT=[F:SOQ]SHIDAT
                Call MODZONALL(2,[F:SOQ]SOHNUM,[F:SOQ]SOPLIN,[F:SOQ]SOQSEQ,"BESDAT",WSHIDAT,WRET) From STKALL
            Endif
        Elsif [M]WALLQTYSTU (NOL) - ([M]ALLQTYSTU(NOL)+[M]SHTQTYSTU(NOL)) < 0
    # ----- C'est une diminution/annulation de l'allocation
            WTRTLIG = "D"
            WQTYSTU = ([M]ALLQTYSTU(NOL)+[M]SHTQTYSTU(NOL)) - [M]WALLQTYSTU(NOL)
            WALLCPS = WQTYSTU
    # ----------- On traite en priorité la quantité rupture
            If [M]SHTQTYSTU(NOL) <> 0
    # ----------- On décrémente la quantité rupture
                If WQTYSTU < [M]SHTQTYSTU (NOL)
                    WSHTSTU = WQTYSTU  : WALLSTU = 0
                Else
    # ----------- On annule la quantité rupture et on décrémente la quantité allouée
                    WSHTSTU = [M]SHTQTYSTU (NOL)
                    WQTYSTU -= WSHTSTU : WALLSTU = WQTYSTU
                Endif
            Else
    # ----------- On traite ensuite la quantité allouée
                If WQTYSTU < ([M]ALLQTYSTU(NOL)+[M]SHTQTYSTU(NOL))
    # ---------------- On décrémente la quantité rupture
                    WSHTSTU = 0 : WALLSTU = WQTYSTU
                Else
    # ---------------- On annule la quantité allouée
                    WTRTLIG = "A"
                    WALLSTU = [M]ALLQTYSTU (NOL)
                Endif
            Endif
        Else
    # ----- C'est une augmentation de l'allocation
            # Issue 73816 : No allocation if credit limit exceeded during order creation/modification
            If OSTNEW > [M:SOH0]OSTAUZ & GCDTUNL=1 Return Endif
            If [M]ALLQTYSTU(NOL) = 0 & [M]SHTQTYSTU(NOL) = 0
                 WTRTLIG = "C"
            Else
                 WTRTLIG = "M"
            Endif
            WSHTSTU = [M]SHTQTYSTU(NOL)
            WALLSTU = [M]WALLQTYSTU(NOL) - ([M]ALLQTYSTU(NOL)+[M]SHTQTYSTU(NOL))
            WALLCPS = WALLSTU
        Endif
    
        If WALLSTU + WSHTSTU <> 0
    #   Génération de l'allocation
    #   (Les quantité allouées et ruptures sont toujours positives)
    #        If [M]STOMGTCOD(NOL) <> 1 & [M]FMI(NOL) <= 1
            If [M]STOMGTCOD(NOL) <> 1
    #           Consommation réservations clients
    #           Si valeur "à la dde" récup. de la réponse faite lors de la saisie
                WUSERERBPC=GUSERERBPC
                If WUSERERBPC=3 WUSERERBPC=[M:SOH4]RERBPCFLG(NOL) Endif
    #           Génération des ruptures
                # --> Récupération du paramêtre stock : Génération de ruptures
                Local Char     WPARAM(10)
                #-- 80866 Performance import
                #Call PARAM([M]DSTOFCY(NOL),"GENSHT",WPARAM) From ADOVAL
                Call PARAML([M]DSTOFCY(NOL),"GENSHT",WPARAM) From ADOVAL
                GGENSHT=val(WPARAM)
                WGENSHT=GGENSHT
    #           On génère tjs les ruptures sur un kit/sous-traité et ses composants (sinon déphasage possible)
                If find([M]LINTYP(NOL),2,3,4,5,10,11,12,13) WGENSHT=2 Endif
    #           On ne génère pas de rupture pour une ligne gérée en contremarque
                If find([M]FMI(NOL),3,5) WGENSHT=1 Endif
    #           Allocations partielles sf si livraison ligne/cde complète
    #           Un kit/sous-traité et ses composants ne peuvent être alloués partiellement (sinon déphasage possible)
                WALLPAR=0
                If find([M]DME,2,3) & !find([M]LINTYP(NOL),2,3,4,5,10,11,12,13) WALLPAR=1 : Endif
    #           Si on essaie uniquement de réallouer de la rupture, il faut autoriser les allocations partielles
                If WTRTLIG="M" & WALLSTU=0 & WSHTSTU<>0 WALLPAR=0 Endif
    
                If WTRTLIG="M" & [M]DSHIDAT(NOL) <> [M]YDSHIDAT(NOL)
                    # Modif de la date d'expédition : Modifier les allocations
                    WSHIDAT=[F:SOQ]SHIDAT
                    Call MODZONALL(2,[F:SOQ]SOHNUM,[F:SOQ]SOPLIN,[F:SOQ]SOQSEQ,"BESDAT",WSHIDAT,WRET) From STKALL
                    If WRET <>0 Return Endif
                Endif
                Call GENALLORD("","",WTRTLIG, WUSERERBPC, WGENSHT, WALLPAR, WALLSTU, WSHTSTU, WRET) From TRTVENALL
                If WRET=2 & GOK=1 Call MESSAGE([M]ITMREF(NOL)-":"-mess(504,197,1)-"\"-mess(44,192,1)) From GESECRAN Endif
                If WRET <> 0 Return : Endif
    
                If WTRTLIG="D" & [M]DSHIDAT(NOL) <> [M]YDSHIDAT(NOL)
                    # Modif de la date d'expédition : Modifier les allocations
                    WSHIDAT=[F:SOQ]SHIDAT
                    Call MODZONALL(2,[F:SOQ]SOHNUM,[F:SOQ]SOPLIN,[F:SOQ]SOQSEQ,"BESDAT",WSHIDAT,WRET) From STKALL
                    If WRET <>0 Return Endif
                Endif
                # Bug 83028
                # Si après une diminution de l'allocation il reste des ruptures, on essaie de les réallouer
                If WTRTLIG="D"
                    If ([M:SOH4]SHTQTYSTU(NOL)-WSHTSTU)>0
                        WALLSTU = 0 : WALLCPS = 0
                        # Bug 84767 : Suite à des tests pb en maj qté rupture sur la cde
                        Local Decimal WWSHTSTU
                        #WTRTLIG = "M"
                        #WSHTSTU = [M]SHTQTYSTU(NOL)-WSHTSTU
                        #Call GENALLORD("","","M", WUSERERBPC, WGENSHT, WALLPAR, WALLSTU, WSHTSTU, WRET) From TRTVENALL
                        WWSHTSTU = [M]SHTQTYSTU(NOL)-WSHTSTU
                        Call GENALLORD("","","M", WUSERERBPC, WGENSHT, WALLPAR, WALLSTU, WWSHTSTU, WRET) From TRTVENALL
                        # Bug 84767
                        If WRET=2 & GOK=1 Call MESSAGE([M]ITMREF(NOL)-":"-mess(504,197,1)-"\"-mess(44,192,1)) From GESECRAN Endif
                        If WRET <> 0 Return : Endif
                        # Bug 84767
                        # On ajoute à la qté rupture à diminuer la qté rupture qui a été réallouée
                        WSHTSTU=WSHTSTU+([M]SHTQTYSTU(NOL)-WSHTSTU-WWSHTSTU)
                        # On ajoute à la qté allouée la qté qui a été réallouée (mis en négatif car WTRTLIG="D"
                        WALLSTU=WALLSTU*-1
                        # Bug 84767
                    Endif
                Endif
                # Bug 83028
            Endif
    
            WALL=WALLSTU*(1/[F:SOP]SAUSTUCOE)
            Call QTEARR(WALL, [F:SOP]SAU) From TRTDIV
            WSHT=WSHTSTU*(1/[F:SOP]SAUSTUCOE)
            Call QTEARR(WSHT, [F:SOP]SAU) From TRTDIV
    #       Création et modification : Qté allouée en +
    #                                  Nouvelle Qté rupture
    #       Annulation et diminution : Qté allouée en -
    #                                  Qté rupture en -
            If find(WTRTLIG, "C","M")
                [F:SOQ]ALLQTYSTU += WALLSTU
                [F:SOQ]ALLQTY    += WALL
                [F:SOQ]SHTQTYSTU = WSHTSTU
                [F:SOQ]SHTQTY    = WSHT
            Else
                [F:SOQ]ALLQTYSTU -= WALLSTU
                [F:SOQ]ALLQTY    -= WALL
                [F:SOQ]SHTQTYSTU -= WSHTSTU
                [F:SOQ]SHTQTY    -= WSHT
            Endif
            [M]ALLQTY(NOL)     = [F:SOQ]ALLQTY
            [M]ALLQTYSTU(NOL)  = [F:SOQ]ALLQTYSTU
            [M]SHTQTY(NOL)     = [F:SOQ]SHTQTY
            [M]SHTQTYSTU(NOL)  = [F:SOQ]SHTQTYSTU
            [M]TALLQTYSTU(NOL) = [F:SOQ]ALLQTYSTU + [F:SOQ]OPRQTYSTU + [F:SOQ]PREQTYSTU + [F:SOQ]ODLQTYSTU
            [M]TALLQTY(NOL)    = [F:SOQ]ALLQTY + [F:SOQ]OPRQTY + [F:SOQ]PREQTY + [F:SOQ]ODLQTY
            # 107888 : Scheduled invoices : (LD:19/05/16)
            #If [M:SOH0]SOHCAT = 3
            If [M:SOH0]SOHCAT = 3 | [M]DLVFLG(NOL)=1
                # Commande à facturation directe
                # Commande normale et ligne non livrable
            # 107888 : Scheduled invoices : (LD:19/05/16)
                [M]TALLQTYSTU(NOL) += [F:SOQ]INVQTYSTU
                [M]TALLQTY(NOL)    += [F:SOQ]INVQTY
            Else
                [M]TALLQTYSTU(NOL) += [F:SOQ]DLVQTYSTU
                [M]TALLQTY(NOL)    += [F:SOQ]DLVQTY
            Endif
        Endif
    Endif
    Return
    ####################################################################
    $TRTSOLDE
    #---------------------------------------------------------------------#
    # Si solde d'une ligne : Suppression des allocations en rupture       #
    #---------------------------------------------------------------------#
    Local  Decimal  LQTY, LSHT
    Local  Integer  LRET
    #If TRTLIG = "M" & SIGN = -1
    #  Maj uniquement si article géré en stock et CF et ligne non soldée
    #   If [F:SOQ]STOMGTCOD <> 1 & [F:SOQ]DEMSTA = 1 & [F:SOQ]SOQSTA <> 3
    #      If [M]SOQSTA(NOL) = 3 & [M]SHTQTY(NOL) <> 0
    #         LQTY=0:CALL MAJSTOALL("","","A", [M]GRPFLG(NOL),LQTY,[F:SOQ]SHTQTYSTU, WRET) From TRTVENALL
    #         If WRET = 1 GOK = -1 Elsif WRET GOK = 0 :ENDIF
    #         Call GENALLORD("","","A", 1, 1, 0, [F:SOQ]ALLQTYSTU, [F:SOQ]SHTQTYSTU, WRET) From TRTVENALL
    #         If WRET <> 0 GOK=0 : Return : Endif
    #         [F:SOQ]SHTQTY   = 0
    #         [F:SOQ]SHTQTYSTU = 0
    #         [M]SHTQTY(NOL)   = 0
    #         [M]SHTQTYSTU(NOL)= 0
    #      Endif
    #   Endif
    #Endif
    Return
    
    ####################################################################
    $LECLIG_SOQ
    #--------------#
    # Lecture SOQ  #
    #--------------#
    Readlock [SOQ] SOQ0=[F:SOP]SOHNUM;[F:SOP]SOPLIN;[F:SOP]SOPSEQ
    # --> Enregistrement locké
    If fstat = 1:GOK=-1:GLOCK="$"+"SORDERQ"-num$([F:SOP]SOPSEQ):Return:Endif
    # --> Historisation si modif. avec avenant
    If fstat = 0 & GREV = 2
        # --> Maj du n.avenant
        [M:SOH4]LINREVNUM(NOL) = [M:SOH0]REVNUM
        Call HISTO_REV ("SOQ", TRTLIG) From TRTVENMAJ
    Endif
    If TRTLIG = "A" Return Endif
    # --> Enregistrement inexistant
    If fstat = 4 | fstat = 5
       Gosub INICRE_SOQ
       Gosub CRELIG_SOQ
       Return
    Endif
    If fstat=0
        # Bug 63360 : En cas de nouvelle tentative de maj après Rollback, Il faut réinitialiser la classe [M]
        [M]ALLQTY(NOL)    = [F:SOQ]ALLQTY
        [M]ALLQTYSTU(NOL) = [F:SOQ]ALLQTYSTU
        [M]SHTQTY(NOL)    = [F:SOQ]SHTQTY
        [M]SHTQTYSTU(NOL) = [F:SOQ]SHTQTYSTU
        # 107888 : Scheduled invoices : (LD:19/05/16)
        #If [M:SOH0]SOHCAT = 3
        If [M:SOH0]SOHCAT = 3 | [M]DLVFLG(NOL)=1
            # Commande à facturation directe
            # Commande normale et ligne non livrable
        # 107888 : Scheduled invoices : (LD:19/05/16)
            [M]TALLQTYSTU(NOL) = [F:SOQ]ALLQTYSTU + [F:SOQ]INVQTYSTU + [F:SOQ]ODLQTYSTU
        Else
            [M]TALLQTYSTU(NOL) = [F:SOQ]ALLQTYSTU + [F:SOQ]DLVQTYSTU + [F:SOQ]ODLQTYSTU
        Endif
        # Bug 63360
    Else
       GOK=0
       Call RSTA("SOQ",[F:SOP]SOHNUM+num$([F:SOP]SOPLIN)+num$([F:SOP]SOPSEQ)) From GLOCK
    Endif
    # Maj des statistiques en modif (situation initiale)
    Call VALSTA("SOD",-1) From SUBPS2
    If GOK < 1 : Return : Endif
    Return
    ####################################################################
    $CRELIG_SOQ
    #----------------------------------#
    # Apres Write de SOP, Write de SOQ #
    #----------------------------------#
    Write [SOQ]
    If fstat <> 0:GOK=0:Call FSTA("SOQ") From GLOCK:Return:Endif
    If GREP="D" & TRTLIG="C" & [M]FOCFLG(NOL)=2
    # Duplication d'une ligne à l'origine d'une gratuit : maj du nouveau de ligne sur le gratuit
        Local Integer I
        I=find ([M]SOPLIN(NOL), [M]ORILIN(0..[M]NBLIG-1))
        If I <> 0 [M]ORILIN(I-1)= [F:SOP]SOPLIN : Endif
    Endif
    # Maj des statistiques
    Call VALSTA("SOD",1) From SUBPS2
    If GOK < 1 : Return : Endif
    Return
    ####################################################################
    $MODLIG_SOQ
    #--------------#
    # Rewrite SOQ  #
    #--------------#
    Rewrite [SOQ]
    If fstat <> 0:GOK=0:Call FSTA("SOQ") From GLOCK:Endif
    # Maj des statistiques
    Call VALSTA("SOD",1) From SUBPS2
    If GOK < 1 : Return : Endif
    Return
    ####################################################################
    $SUPLIG_SOQ
    #-------------#
    # Delete SOQ  #
    #-------------#
    
    If left$([F:SOQ]SOQTEX,3)="SOQ"
        Call SUP_CLOB([F:SOQ]SOQTEX,WRET) From TRTX3TEX
    Endif
    
    Delete [SOQ]
    If fstat = 1:GOK=-1:GLOCK="$"+"SORDERQ"-num$([F:SOP]SOPSEQ):Return:Endif
    # Maj des statistiques
    Call VALSTA("SOD",-1) From SUBPS2
    If GOK < 1 : Return : Endif
    Return
    
    ####################################################################
    $VERIF_CRE
    If OK=0 Return Endif : # Bug 49634 : Si positionné par le spécifique, inutile de continuer
    Gosub VERIF
    Return
    ####################################################################
    $INICRE
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #--Too many instructions => moved to SUBSOHA1
    Gosub INICRE From SUBSOHA1
    # End issue 107888
    
    Return
    ####################################################################
    # 101874 : V9 : Taxe code control
    # valorisation TTC (idem calcul facture)
    ####################################################################
    $INIVALTTC
    
    Global Integer G_CLCDSPLIN : G_CLCDSPLIN=1
    # Valuation is always done in this case
    GVALTTC=2
    #---- Paramètres complementaires appel valorisation
    # PARAM_T(0) : Flag contrôle des taxes             (1=Non/2=Oui)
    # PARAM_T(1) : Lecture de la trace par le sous-pro (1=Non/2=Oui)
    # PARAM_T(2) : Flag retour                         (1=KO/2=OK)
    Local    Char     PARAM_T (25) (0..10)
    PARAM_T(0)="2"      : # Contrôle des taxes lors de la création
    If GIMPORT
        PARAM_T(1)="1"  : # Import     : Pas de lecture de la trace
    Else
        PARAM_T(1)="2"  : # Interactif : Lecture de la trace
    Endif
    PARAM_T(2)=num$(0)
    Call VALTTC ("GESSOH", PARAM_T) From TRTVENFACR
    If PARAM_T(2)="1" GERR=1 : GOK=0 : Return Endif
    #Call VALTTC ("GESSOH") From TRTVENFACR
    
    Return
    # 101874
    ####################################################################
    $AB_CRE_MOD
    Gosub DEVERROU_SQH
    Return
    
    ####################################################################
    $APRES_CRE
    Local Char TBPAR(10)(1..50),TBVAL(30)(1..50), LREP(GLONREP)
    
    # V6 Affectations
    Gosub MAJ_MTO_AP_ALL From SALMTOLIB
    
    # Mis à jour dans MAJMVC
    #--------------------------------------------------------------------#
    # Mise à jour de la fiche prospect/client             CRM 10.07.2000 #
    #--------------------------------------------------------------------#
    #Call SETORDFIRDAT([M:SOH0]BPCORD,[M:SOH0]ORDDAT) From SUBBPCB
    
    #--------------------------------------------------------------------#
    # Création des contrats de service liés à la cde      CRM 18.09.2000 #
    #--------------------------------------------------------------------#
    
    # X3-69134 : Performance enhancements for sales order import / X3-91094 : Miscellaneous improvements (PJT, CRM calls) (LD:05/30/18)
    # Done in $CREATION
    #If dim([M:SOH1]REP(0))>0 LREP=[M:SOH1]REP(0) Endif
    #
    #Call CRECONSER([M:SOH0]SOHNUM, [M:SOH0]SALFCY, [M:SOH0]BPCORD, [M:SOH1]BPCINV, LREP,
    #&              [M:SOH0]ORDDAT, [M:SOH0]CUR) From SUBCONB1
    # X3-69134 : Performance enhancements for sales order import / X3-91094 : Miscellaneous improvements (PJT, CRM calls) (LD:05/30/18)
    
    #--------------------------------------------------------------------#
    # Gestion des points                                  CRM 24.09.2003 #
    #--------------------------------------------------------------------#
    Local Integer IERRINF
    #LSE 21/03/2005 rajout 2 paramètres
    Local Integer ICHAPTER
    Local Integer IBRETOUR
    IERRINF = 0
    ICHAPTER= 0
    IBRETOUR= 1
    
    Call SOHPOINT([M:SOH0]SOHNUM, IERRINF, ICHAPTER, IBRETOUR ) From TRTPOINT
    If IERRINF
        GMESSAGE = mess(IERRINF, ICHAPTER, 2)
        GERR = 1
    Endif
    
    #--------------------------------------------------------------------#
    # Incrémentation des étapes avant-vente de l'affaire  CRM 22.10.2003 #
    #--------------------------------------------------------------------#
    #LSE 07/08/2006 déplacer dans création
    #Call ADDOPPSTE("SOH", [M:SOH1]PREOPP, [M:SOH1]PJT) From SUBOPPB
    
    If [F:SOH]OCNFLG = 2 & WSLTDOCFLG = 2
    #--------------------------------------------------------------------#
    # Impression bon de commande                                         #
    #--------------------------------------------------------------------#
       Gosub SET_CLE From GOBJSUB
       CLECUR = 1
    Endif
    
    If [F:SOH]OCNFLG = 2 & WSLTDOCFLG = 2 & !GIMPORT
      # FGR 20/08/2014 : X3SUIVI86923 (début)
      #  If [M:SOH0]DOCNAM<>""
      #    [L]REPORT1=[M:SOH0]DOCNAM
      #  Elsif WSLTDOCNAM<>""
      #    [L]REPORT1=WSLTDOCNAM
      #  Endif
      #  Call ETAT([L]REPORT1,"GESSOH",TBPAR,TBVAL) From ETAT
      If [M:SOH0]DOCNAM <> "" Then
        [L]AREPORT = [M:SOH0]DOCNAM
      Elsif WSLTDOCNAM <> "" Then
        [L]AREPORT = WSLTDOCNAM
      Endif
      Call IMPCOMP([L]REPORT1, [L]AREPORT, GFONCTION, OK, NBMASK, NOMMSK, ABMSK, AMA, TIT) From ETAT
      # FGR 20/08/2014 : X3SUIVI86923 (fin)
    Endif
    
    # 117129 - Move SE and SST web service calls outside of transactions
    Gosub RECALC_SST From SUBSOHA1
    
    # 78411 Sage Exchange
    If func AFNC.ACTIV("SEPP") & func SEPPLIB.SEPP_DOC([M:SOH3]PTE)
      # If !GIMPORT & !func SEPPCDT.SEPP_OK(2,[M:SOH0]SOHNUM,1) & [M:SOH1]CDTSTA<>4              # 119005 old
      If !GIMPORT & !GWEBSERV & !func SEPPCDT.SEPP_OK(2,[M:SOH0]SOHNUM,1) & [M:SOH1]CDTSTA<>4    # 119005 new
        Call CALL_SEAUTH(2,[M:SOH0]SOHNUM) From TRTSEAUTH
      Endif
    Endif
    
      # -------------------------------------------------
      # Issue X3-31898 - 2017-11-23 by FGR : BEGIN
      # Issue X3-18442/120906 - 2017-01-13 by FGR : BEGIN
      #Gosub PJM_ORDERS_SOQQTY From SUBSOHA1
      # Issue X3-18442/120906 - 2017-01-13 by FGR : END
      # Issue X3-31898 - 2017-11-23 by FGR : END
      # -------------------------------------------------
    
    If !GIMPORT
        # Maintenant on fait toujours un gosub RELIT
        Gosub RELIT From GOBJSUB
        [M:SOH0]SOHNUM = [F:SOH]SOHNUM
    
        # 112893.sn - Allocate if credit card authorization succeeded
      If GINIALLORD=2 & (GAPPSOH<2 | ((GSOHAPPORD=2 & GSOHAPPALL=2) | [M:SOH1]APPFLG>2))
        If [M:SOH1]CDTSTA = 1 & func AFNC.ACTIV("SEPP") & func SEPPLIB.SEPP_DOC([M:SOH3]PTE)
    
          BOUT = "1"
    
          Gosub INI_TRTORDALL       From TRTVENFEN
          Local Char PARAM(10)(8)
          Gosub OUV_TRTORDALL       From TRTVENFEN
    
          PARAM(1) = "0"
          PARAM(2) = "1"
          PARAM(3) = "2"
          PARAM(4) = "0"
          PARAM(5) = "0"
          PARAM(6) = "2"
          PARAM(7) = "1"
          FIN=1
    
          Gosub CONT_TRTORDALL      From TRTVENFEN
          Gosub EXEC_TRTORDALL      From TRTVENFEN
          Gosub TERMINE_TRTORDALL   From TRTVENFEN
          Raz GTRACE      # TODAN-120377
    
          Affzo [M:SOH1]ALLSTA
          Affzo [M:SOH4]WALLQTY
          Affzo [M:SOH4]ALLQTY
          Kill PARAM
    
        Endif
      Endif# 112893.en
    
    Else
        # If faut repasser dans liens même en import pour recalculer l'état de la commande
        Gosub LIENS From TABLEAUX
    Endif
    
    Return
    
    # Bug 77357
    ##############################################################################################
    # Action AVANT_MOD à executer aussi quand on clique sur un bouton qui déclenchera le bt enr
    ##############################################################################################
    $AVANT_MOD_BOUT
    
    # X3-218176 : Orders not put back to credit hold after lines added / X3-226050 - 2020-12-08 by LD
    Local Decimal WSVG_ORDATI    : WSVG_ORDATI=[F:SOH]ORDATI
    # X3-218176 : Orders not put back to credit hold after lines added / X3-226050 - 2020-12-08 by LD
    
    # Diminution de l'encours du montant de la commande en cours de modif
    # X3-218176 : Orders not put back to credit hold after lines added / X3-226050 - 2020-12-08 by LD
    #If GOSTORD = 2 & COUZON <> "BPCINV" [M:SOH0]OST -= [F:SOH]ORDATI Endif
    If GOSTORD = 2 & [M:SOH2]UNL<>2 & COUZON <> "BPCINV" [M:SOH0]OST -= [F:SOH]ORDATI Endif
    # X3-218176 : Orders not put back to credit hold after lines added / X3-226050 - 2020-12-08 by LD
    
    Return
    ####################################################################
    # Bug 77357
    # X3-71649 Modify SALREV parameter - modif: Szymon Dzumak
    ####################################################################
    $DEM_AVENANT
    Local Integer WOK
    
    If GREV <> 0 Return Endif
    If find(GREP,"C","D") Return Endif
    # --> Demande de modification avec ou sans avenant
    GREV = 1
    
    If GSALREV = 2
          WOK=1
       If !GIMPORT Call OUINON(mess(51,194,1),WOK) From GESECRAN Endif
       If WOK=2
          GREV=2
          [M:SOH0]REVNUM+=1
          Endif
    Elsif GSALREV = 3
       GREV=2
       [M:SOH0]REVNUM+=1
    Endif
    
    Return
    ####################################################################
    $AVANT_MODFIC
    Local Integer SPSTAT, WRET
    Local Decimal COURS
    #------------------------------------------#
    # Traitement avant modification            #
    # --> Déduction des mouvements clients     #
    # --> Historisation si modif. avec avenant #
    #------------------------------------------#
    
    #-- Maj de l'encours des commandes ---#
    Local Char WSENS, WGREP
    WSENS='-'  : WGREP=''
    Gosub MAJ_ENCOURS
    If GOK<1: Return: Endif
    
    # V6 Affectations
    Gosub AVANT_MODFIC From SALMTOLIB
    
    # Maj des statistiques
    Call VALSTA("SOH",-1) From SUBPS2
    If GOK < 1 : Return : Endif
    
    # Issue X3-86334 - 2018-05-09 By USA : Begin
      If GREV = 2 Then
        Call INCREASE_VSORDER_RECORD([F:SOH]SALFCY, [F:SOH]SOHNUM, [F:SOH]REVNUM, [M:SOH0]REVNUM) From SUBSOHREV
        Call HISTO_REV("SOH", "M") From TRTVENMAJ
      Endif
    # Issue X3-86334 - 2018-05-09 By USA : End
    
    # Alimentation cours en devise société
    If [F:SOH]CUR<>[M]CUR | [F:SOH]SALFCY<>[M]SALFCY | [F:SOH]ORDDAT<>[M]ORDDAT
       Call COURSITE([M]CUR,[M]SALFCY,[M]CHGTYP,[M]ORDDAT,COURS,SPSTAT) From TRTDEV
       [F:SOH]CHGRAT=COURS
    Endif
    
    ## Si modification de la date, forcage de la modif sur les lignes
    #If !find(GREP,"C","D") & ([F:SOH]ORDDAT<>[M:SOH0]ORDDAT | [F:SOH]BPCINV<>[M:SOH1]BPCINV)
    #   Local Integer NLIG
    #   For NLIG = 0 To [M]NBLIG-1
    #      If GREV=2 [M]LINREVNUM(NLIG)=[M:SOH0]REVNUM Endif
    #      [M]UPDFLG(NLIG) = 1
    #   Next NLIG
    #Endif
    ## Si modification de la zone affaire, forcage de la modif sur les lignes pour maj en-cours
    #If !find(GREP,"C","D") & [F:SOH]PJT <> [M:SOH1]PJT
    #   Local Integer NLIG
    #   For NLIG = 0 To [M]NBLIG-1
    #      If [M]WIPFLG(NLIG)= "" [M]WIPFLG(NLIG)="M" Endif
    #      If GREV=2 [M]LINREVNUM(NOL)=[M:SOH0]REVNUM Endif
    #      [M]UPDFLG(NLIG) = 1
    #   Next NLIG
    #Endif
    
    # --> Forçage de la modif sur les lignes
    If !find(GREP,"C","D")
        # --> Si modification de la date,
        # --> Si modification de la zone affaire, forcage de la modif sur les lignes pour maj en-cours
        # --> Si Cde signée, allouée et pas d'allocation des cdes non signées : Déallocation automatique de la cde
        #     après annulation des signatures existantes
        # --> Si Cde signée ou partiellement signée et encours article cde non signée à Non, suppression des encours article
        #     après annulation des signatures existantes
        If ([F:SOH]ORDDAT<>[M:SOH0]ORDDAT | [F:SOH]BPCINV<>[M:SOH1]BPCINV) |
    &      ([F:SOH]PJT <> [M:SOH1]PJT) |
    &      ((GAPPSOH>1 & ([F:SOH]APPFLG>2 | ([F:SOH]APPFLG=2 & GSOHAPPORD=2)) &
    &       (GUPDAPPFLG=2 | find (2,[M:SOH4]WUPDAPPFLG(0..[M:SOH4]NBLIG-1)))))
            Local Integer NLIG
            For NLIG = 0 To [M]NBLIG-1
                 # Issue X3-38651
    #            If [F:SOH]PJT <> [M:SOH1]PJT
    #                If [M]WIPFLG(NLIG)= "" [M]WIPFLG(NLIG)="M" Endif
    #            Endif
                 # End issue X3-38651
                # Modification d'une Cde signée ou partiellement signée
                If ((GAPPSOH>1 & ([F:SOH]APPFLG>2 | ([F:SOH]APPFLG=2 & GSOHAPPORD=2)) & (GUPDAPPFLG=2 | find (2,[M:SOH4]WUPDAPPFLG (0..[M:SOH4]NBLIG-1)))))
                    # Issue 113857
                    # Ne plus supprimer systématiquement les allocations en cas d'annulation signature
                    # supprimer ssi la cde repasse à non signée : Suppression par la règle de workflow)
    #                # Si Cde allouée et pas d'allocation des commandes non signées : Déallocation automatique de la cde
    #                If GSOHAPPORD=1 | GSOHAPPALL=1
    #                    Raz [M:SOH4]WALLQTY(NLIG), WALLQTYSTU(NLIG)
    #                Endif
                    # End issue 113857
    
                    # 91786 : Ne plus supprimer systématiquement l'encours en cas d'annulation signature
                    # supprimer ssi la cde repasse à non signée : Suppression par la règle de workflow)
                    # Suppression des encours articles
                    #[M]WIPFLG(NLIG)="A"
                    # 91786
                Endif
                If GREV=2 [M]LINREVNUM(NLIG)=[M:SOH0]REVNUM Endif
                [M]UPDFLG(NLIG) = 1
            Next NLIG
        Endif
    Endif
    
    # Bug 61909 : Vérification à faire en INIMOD après VALTTC
    Local Char    WSVG_PTE(GLONPTE) : WSVG_PTE=[F:SOH]PTE
    Local Decimal WSVG_ORDINVATI    : WSVG_ORDINVATI=[F:SOH]ORDINVATI
    ## Recherche s'il faut modifier les acomptes
    ## --> Si la condition de paiement a été modifiée
    ## --> Si le montant commande a évolué et que la commande n'est pas facturée
    #MODPTE=0 : Gosub TRT_ACPTE
    
    #--CPO 82311 Echéance d'acompte et modification du client facture ou du tiers payeur
    #--Test du dim => surtout pour l'inter-site
    If dim(MODBPCINV)<=0 : Local Shortint  MODBPCINV : Endif
    If dim(MODBPCPYR)<=0 : Local Shortint  MODBPCPYR : Endif
    Raz MODBPCINV,MODBPCPYR
    
    If [M:SOH1]BPCINV<>[F:SOH]BPCINV : MODBPCINV = 1 : Endif
    If [M:SOH1]BPCPYR<>[F:SOH]BPCPYR : MODBPCPYR = 1 : Endif
    #--/
    
    # Cas particulier où on modifie le texte en le supprimant
    Local Integer WRET
    If [M:SOH0]SOHTEX1="" & left$([F:SOH]SOHTEX1,3)="SOH"
        Call SUP_CLOB([F:SOH]SOHTEX1,WRET) From TRTX3TEX
    Endif
    If [M:SOH0]SOHTEX2="" & left$([F:SOH]SOHTEX2,3)="SOH"
        Call SUP_CLOB([F:SOH]SOHTEX2,WRET) From TRTX3TEX
    Endif
    
    # --> Gestion des signatures
    # Positionnement indicateur "Annulé" sur les lignes de suivi de workflow
    If GAPPSOH>1 & (GUPDAPPFLG=2 | find(2,[M:SOH4]WUPDAPPFLG(0..[M:SOH4]NBLIG-1)) | [F:SOH]APPFLG=1)
      Call ANNULE_SUIVI("SOH",mess(652,197,1),1,WRET) From TRTVENDIV
      If GOK<1  Return : Endif
    Endif
    
    # En Import, permet la maj des champs suite à solde d'une ligne de commande
    If GIMPORT & dim(G_TRTIMPORT)>0
        Gosub ACTION From =G_TRTIMPORT
    Endif
    
    Return
    
    ####################################################################
    $MAJ_ENCOURS
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    Local Decimal WORDBPINOT, WORDBPIATI
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    
    #----- Maj si cde signée ou Si Paramètre maj encours client cde non signée à "Oui" et cde non intra-société
    # If !([F:SOH]BETFCY=2 & [F:SOH]BETCPY<=1)
    If ([F:SOH]APPFLG>2 | GSOHAPPOST=2) & !([F:SOH]BETFCY=2 & [F:SOH]BETCPY<=1)
        #---- Maj mouvement client (déduction en commande client cde)
        Call  MAJMVC ([F:SOH]BPCORD, [F:SOH]CUR, [F:SOH]CHGTYP, 0, [F:SOH]ORDDAT, [F:SOH]SOHNUM, [F:SOH]SALFCY,
    &       [F:SOH]ORDNOT, [F:SOH]ORDATI, WSENS, "C", "", [F:SOH]SOHCAT) From TRTBPMVT          : # Bug 70837
    #&       [F:SOH]DLRNOT, [F:SOH]DLRATI, WSENS, "C", "", [F:SOH]SOHCAT) From TRTBPMVT         : # Bug 70837
        If GOK<1: Return: Endif
    
        # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
        #---- Maj mouvement client (déduction en commande)
    #    Call  MAJMVC ([F:SOH]BPCORD, [F:SOH]CUR, [F:SOH]CHGTYP, 0, [F:SOH]ORDDAT, [F:SOH]SOHNUM, [F:SOH]SALFCY,
    #&       [F:SOH]DLRNOT, [F:SOH]DLRATI, WSENS, "F", WGREP, [F:SOH]SOHCAT) From TRTBPMVT
        # On order amount : To deliver amount for deliverable products + To scheduled invoice amount for undeliverable products
        WORDBPINOT = [F:SOH]DLRNOT+[F:SOH]INRSCHNOT
        WORDBPIATI = [F:SOH]DLRATI+[F:SOH]INRSCHATI
        Call  MAJMVC ([F:SOH]BPCORD, [F:SOH]CUR, [F:SOH]CHGTYP, 0, [F:SOH]ORDDAT, [F:SOH]SOHNUM, [F:SOH]SALFCY,
    &       WORDBPINOT, WORDBPIATI, WSENS, "F", WGREP, [F:SOH]SOHCAT) From TRTBPMVT
        If GOK<1: Return: Endif
        # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    Endif
    
    Return
    
    ############################################################################
    $TRT_ACPTE
    Local Integer NVXPAMTYP, ANCPAMTYP, WSTAT
    # ------------------------------------------------------------------------ #
    # Traitement des acomptes en cas de modification d'une commande            #
    #            Modif. du montant de la cde ou modif de la condition paiement #
    # ------------------------------------------------------------------------ #
    # Effectué en AVANT_MODFIC                                                 #
    # car seul endroit où on a en ligne les anciennes et les nvelles valeurs   #
    # Dans [F], les anciennes valeurs, Dans [M], les nouvelles valeurs         #
    # ------------------------------------------------------------------------ #
    If [M:SOH4]ORDINVATI=WSVG_ORDINVATI & [M:SOH3]PTE=WSVG_PTE | [M:SOH1]INVSTA<>1 Return Endif
    
    WSTAT=1
    # On recherche s'il y a des acptes (1), s'ils sont émis (2), versés (0)
    Call ACOMPTES(5,3,[M:SOH0]SOHNUM,[M:SOH4]NBLIG,[M:SOH3]PTE,[M:SOH0]ORDDAT,[M:SOH4]ORDINVNOT,[M:SOH4]ORDINVATI,
    &                 [M:SOH0]CUR,0,"","","",1,WSTAT) From TRTTPT
    If WSTAT=0 Raz GMESSAGE, GERR : Return Endif   : # Acomptes versés : Rien à faire
    
    If clalev ([F:TPT])=0 Local File TABPAYTERM [TPT] Endif
    # Si nvlle condition paiement : on recherche s'il y aura des acptes
    Raz NVXPAMTYP
    If [M:SOH3]PTE<>WSVG_PTE
        Filter [F:TPT] Where PTE=[M:SOH3]PTE & PAMTYP=2
        Read [F:TPT] First
        If !fstat NVXPAMTYP=2 Else NVXPAMTYP=1 Endif
        Filter [F:TPT] :#--CPO 82311 Problème découvert lors du traitement de cette fiche
    Endif
    ## VPO 25/08/09 56410 test modifié et déplacé plus bas
    ##If WSTAT=3 & NVXPAMTYP<>2 Return Endif         : # Pas d'acomptes : Rien à faire
    
    # Il y a des acomptes
    # On recherche si les acptes sur la cde sont saisis ou générés
    Filter [F:TPT] Where PTE=WSVG_PTE & PAMTYP=2
    Read [F:TPT] First
    If !fstat ANCPAMTYP=2 Else ANCPAMTYP=1 Endif
    Filter [F:TPT] :#--CPO 82311 Problème découvert lors du traitement de cette fiche
    
    ## VPO 25/08/09 56410
    If WSTAT=3 & NVXPAMTYP<>2 & ANCPAMTYP=1 Return Endif         : # Pas d'acomptes et aucun accompte à faire: Rien à faire
    
    If WSTAT<>2 & (ANCPAMTYP=2 & NVXPAMTYP=0)
        MODPTE=1                : # Acptes générés non émis et modif mnt cde : recalcul automatique
    Elsif WSTAT=2 | NVXPAMTYP=0 : # Acptes émis ou modif mnt cde : On ne fait rien, affichage msg d'information
        If NVXPAMTYP<>0
            GMESSAGE=mess(195,191,1) : # Nvelle condition paiement sans acompte
        Else
            GMESSAGE=mess(196,191,1) : # Même condition paiement mais modif mnt cde
        Endif
        MODPTE=0 : GMESSAGE-=":"-mess(199,191,1) : GERR=2
    Else                        : # Acptes non émis : on peut les modifier
        If NVXPAMTYP=1               : # Nvelle condition paiement sans acompte
            # Dde de suppression des acptes existants
            WOK=2 : Call OUINON(mess(195,191,1)-":\"-mess(197,191,1),WOK) From GESECRAN
            If WOK=1 MODPTE=0 Else MODPTE=3 : Endif
        Elsif NVXPAMTYP=2            : # Nvelle condition paiement avec acompte
            MODPTE=1:WOK=2
            # S'il y avait des acomptes, Dde de recalcul
            If WSTAT<>3 Call OUINON(mess(195,191,1)-":\"-mess(198,191,1),WOK) From GESECRAN Endif
            If WOK=1 MODPTE=0 Endif
        Endif
    Endif
    Close Local File [TPT]
    Return
    
    ####################################################################
    $VERIF_MOD
    #-----------------------#
    # Verification en modif #
    #-----------------------#
    If OK=0 Return Endif : # Bug 49634 : Si positionné par le spécifique, inutile de continuer
    Gosub VERIF : If OK=0 Return Endif
    
    Gosub GATHER_CONTRACTS_TO_UPDATE From SUBSOHA1 # Issue X3-246053 by MRDAB
    Gosub LOCK_PREPAYMENT_CONTRACTS From SUBSOHA1 # Issue X3-244526 by MRDAB
    
    # --> Gestion des signatures
    # Modification de champs, ajout, suppr d'une ligne de prix : Annulation des signatures existantes
    If GAPPSOH>1 & find([F:SOH]APPFLG, 2,3) & (GUPDAPPFLG=2 | find (2,[M:SOH4]WUPDAPPFLG (0..[M:SOH4]NBLIG-1)))
       OK=2 : Call AVERTIR(mess(230,191,1),OK) From GESECRAN
       If OK=1 OK=0 : Return Else OK=1 : Endif
       # Commande allouée et pas d'allocation des commandes non signées : Déallocation automatique de la commande
       If find([F:SOH]ALLSTA,2,3) & (GSOHAPPORD=1 | GSOHAPPALL=1)
           OK=2 : Call AVERTIR(mess(231,191,1)-":\"-mess(232,191,1),OK) From GESECRAN
           If OK=1 OK=0 : Return Else OK=1 : Endif
       Endif
    Endif
    
      # -------------------------------------
      # FGR 13/02/2014 : X3SUIVI96419 (début)
      Local Integer NI
      Local Char SMESSLIGN(type(GMESSAGE)-10)
      Local Integer NE
    
      Raz SMESSLIGN
      NE = 0
      For NI = 0 To [M:SOH4]NBLIG
        If [M:SOH4]CONNUM(NI) <> "" and [M:SOH4]SOQSTA(NI) <> 3 Then
          # Toutes les lignes relatives à un contrat et non soldées doivent être supprimées
          If SMESSLIGN <> "" Then
            SMESSLIGN += ","
          Endif
          SMESSLIGN -= num$(NI+1)
          NE += 1
          If NE > 10 Then
            # 10 c'est déjà pas mal
            SMESSLIGN -= "..."
            Break
          Endif
        Endif
      Next NI
      If SMESSLIGN <> "" Then
        GERR = 1
        OK = 0
        GMESSAGE = mess(391,192,1) - "(" + mess(7,105,1) - ":" + SMESSLIGN + ")"
        Return
      Endif
      # FGR 13/02/2014 : X3SUIVI96419 (fin)
      # -------------------------------------
    Return
    
    ####################################################################
    $INIMOD
    # Issue X3-123565 - 20190212 by VAVIL : Chronological control on Sales Orders,
    # Open Orders and Quote, for Portuguese Legislation
    If func PORLEGLIB.DIGSIGN([M:SOH0]SALFCY,"")
      Local Integer WERR
      Call LEC_TSO_LEG(GCURLEG,[M]SOHTYP,WERR) From TRTLECLEG
      If WERR Raz [F:TSO] : Call RSTA("TSO", [M]SOHTYP) From GLOCK : Endif
      [M:SOH0]SOHTYP  = [F:TSO]SOHTYP
      GCPT = [F:TSO]CODNUM
      If [F:TSO]CODNUM <> ""
         GCPT=[F:TSO]CODNUM
      Else
          Call LECTCA(5,WRET) From SUBTCA
          If fstat | !WRET
              GERR=1 : GMESSAGE=mess(58,105,1)-mess(5,14,1)-mess(250,199,1) : Return
          Endif
          GCPT = [F:TCA]CODNUM([F:TSO]SOHCAT+8)
      Endif
      If GOK=0 : GERR = 1 :  Return : Endif
    Endif
    # Issue X3-123565 end
    
    #-----------------------------#
    # Chargement avant le Rewrite #
    #-----------------------------#
    # FGR 20/11/2015 : X3SUIVI112575 (début) : c'était fait trop tard
    If dim(GWEBSERV)=1 & GWEBSERV=1
      #----- Gestion des adresses                         : # Bug 78821
      If dim([M:ADB1]ADBFLG) [M:ADB1]ADBFLG=2 Endif       : # Bug 78821
      If dim([M:ADB2]ADBFLG) [M:ADB2]ADBFLG=2 Endif       : # Bug 78821
      If dim([M:ADB3]ADBFLG) [M:ADB3]ADBFLG=2 Endif       : # Bug 78821
    Endif
    # FGR 20/11/2015 : X3SUIVI112575 (fin) : c'était fait trop tard
    # 86037 : Flag signé à vide après solde ligne de cde
    ## --> Gestion des signatures
    #If [F:SOH]ORDSTA<>2 & (GUPDAPPFLG=2 | find (2,[M:SOH4]WUPDAPPFLG (0..[M:SOH4]NBLIG-1)) | [F:SOH]APPFLG=1)
    #  If GAPPSOH>1 [F:SOH]APPFLG=0 Else [F:SOH]APPFLG=4 : Endif
    #Endif
    # 86037
    
    # -- Raz variable utilisée pour la maj des mvts clients
    Raz WQUONOT, WQUOATI
    
    Gosub CHARGENTETE
    
    # 86037 : Flag signé à vide après solde ligne de cde
    # --> Gestion des signatures
    If [F:SOH]ORDSTA<>2 & (GUPDAPPFLG=2 | find (2,[M:SOH4]WUPDAPPFLG (0..[M:SOH4]NBLIG-1)) | [F:SOH]APPFLG=1)
      If GAPPSOH>1 [F:SOH]APPFLG=0 Else [F:SOH]APPFLG=4 : Endif
    Endif
    # 86037
    
    # Tax by document
    # If func AFNC.ACTIV("LTA") & GLOCUSATAX   # 106867.o
    If func AFNC.ACTIV("LTA") & [F:CPY]SSTTAXACT = 2   # 106867.n
      GTAXBYDOC = 1
    Endif
    # --- Valorisation TTC (idem calcul facture)
    # 101874 : V9 : Taxe code control
    Gosub INIVALTTC
    If GOK=0 : Return Endif
    # 101874
    
    # Bug 61909
    # Recherche s'il faut modifier les acomptes
    # --> Si la condition de paiement a été modifiée
    # --> Si le montant commande a évolué et que la commande n'est pas facturée
    MODPTE=0 : Gosub TRT_ACPTE
    
    # Bug 57682
    If dim(GWEBSERV)=1 & GWEBSERV=1
      If [M:ACL1]CLOB=[M:ACL1]CLOBSVG & [M:ACL2]CLOB=[M:ACL2]CLOBSVG
        # Si aucune modification de texte, ne rien faire !
      Else
        Call RANGE_TEXTE ([L]WRET)
        ##----- Gestion des adresses                      : # Bug 78821
        #If dim([M:ADB1]ADBFLG) [M:ADB1]ADBFLG=2 Endif    : # Bug 78821
        #If dim([M:ADB2]ADBFLG) [M:ADB2]ADBFLG=2 Endif    : # Bug 78821
        #If dim([M:ADB3]ADBFLG) [M:ADB3]ADBFLG=2 Endif    : # Bug 78821
      Endif
      # FGR 20/11/2015 : X3SUIVI112575 (début) : c'est déjà trop tard
      #----- Gestion des adresses                         : # Bug 78821
      #If dim([M:ADB1]ADBFLG) [M:ADB1]ADBFLG=2 Endif       : # Bug 78821
      #If dim([M:ADB2]ADBFLG) [M:ADB2]ADBFLG=2 Endif       : # Bug 78821
      #If dim([M:ADB3]ADBFLG) [M:ADB3]ADBFLG=2 Endif       : # Bug 78821
      # FGR 20/11/2015 : X3SUIVI112575 (fin) : c'est déjà trop tard
    Endif
    # Bug 57682
    
    #85785 * RMA * document amount cannot be negative
    If func PORLEGLIB.DIGSIGN("", [F:SOH]CPY) & ([F:SOH]ORDINVATI<0 | [F:SOH]ORDINVATIL<0)
      GERR = 1: GMESSAGE = mess(00216,00191,1) : GOK = 0 : Return
    Endif
    
    Return
    
    # Bug 57682
    ##################################################
    # Sous-programme nécessaire pour le Webservice   #
    ##################################################
    # Rangement des textes entête et pied en mémoire #
    ##################################################
    Subprog RANGE_TEXTE(STAT)
    Variable Integer STAT
    #----- Variables locales -----#
    Local Integer WDBASE
    Local Integer WEXIST
    Local Char    PARAM(50)(1..6)
    #-----
    [L]PARAM(2)="SOH"
    [L]PARAM(3)="TRTX3TEX"
    [L]PARAM(4)=""
    [L]PARAM(5)="0"
    [L]PARAM(6)="1"
    If [M:ACL1]CLOB<>[M:ACL1]CLOBSVG
    
      # Issue X3-33114 - 2017-05-22 by CPO : Replace transclass with Transmask in sales process (transmask cannot be used here)
      [M:ACL]=[M:ACL1]
    
      [L]PARAM(1)=[M:SOH0]SOHTEX1
      Gosub EXEC From TRTX3TEX
      Call RANGE_CLOB ([M:ACL]CLOB,[L]PARAM(1),STAT) From ACLOB
      If STAT=1
        Call ERREUR(mess(215,126,1)-"("+num$(GCLOMEM)-"Ko)") From GESECRAN
      Endif
      [M:SOH0]SOHTEX1=[L]PARAM(1)
    Endif
    If [M:ACL2]CLOB<>[M:ACL2]CLOBSVG
    
      # Issue X3-33114 - 2017-05-22 by CPO : Replace transclass with Transmask in sales process (transmask cannot be used here)
      [M:ACL]=[M:ACL2]
    
      [L]PARAM(1)=[M:SOH0]SOHTEX2
      Gosub EXEC From TRTX3TEX
      Call RANGE_CLOB ([M:ACL]CLOB,[L]PARAM(1),STAT) From ACLOB
      If STAT=1
        Call ERREUR(mess(215,126,1)-"("+num$(GCLOMEM)-"Ko)") From GESECRAN
      Endif
      [M:SOH0]SOHTEX2=[L]PARAM(1)
    Endif
    Raz mkstat
    End
    # Bug 57682
    
    ####################################################################
    # FGR 13/02/2014 : X3SUIVI96419 : plus de place déplacé dans SUBSOHA1
    #$MODIF
    #
    ##----------------------------------------------------------------#
    ## Modification des enregistrements sans SVCRVAT et SVCRFOOT      #
    ##----------------------------------------------------------------#
    #Call UPD_VALORISATION ("M","SOH") From TRTVENFACC
    #If GOK<1 Return Endif
    #
    ##-------------------------------------#
    ## Modification des lignes de commande #
    ##-------------------------------------#
    #If clalev([F:SOQ1])=0 Local File SORDERQ[SOQ1] Endif
    #If clalev([F:SOP1])=0 Local File SORDERP[SOP1] Endif
    #Gosub CAL_OST : # Issue 73816 : No allocation if credit limit exceeded during order creation/modification
    #Gosub MODIF From TABLEAUX
    #If GOK<1 : Return : Endif
    #
    ##----------------------------------------------------------------#
    ## ACA - Modification des enr. analytiques des elts de facturation#
    ##----------------------------------------------------------------#
    #[M:SIHV]VCRTYP=20 : [M:SIHV]NUM=[F:SOH]SOHNUM
    #Gosub CREMOD_DIE_FOOT From SUBSIHV
    #If GOK < 1 : Return : Endif
    #
    #Close Local File [SOP1]
    #Close Local File [SOQ1]
    #
    #Default File [SOH]
    #
    ## Recalcul des statuts de la commande
    #Gosub MAJSTASOH From SUBSOHB
    ##----------------------------#
    ## Maj des mouvements clients #
    ##----------------------------#
    #
    ##-- Maj de l'encours des commandes ---#
    #Local Char WSENS, WGREP
    #WSENS='+'  : WGREP=GREP
    #Gosub MAJ_ENCOURS
    #If GOK<1: Return: Endif
    #
    ## Bug 64124 : Calcul état crédit de la commande (pour que CDTSTA soit maj lors de l'appel au workflow)
    #Call SDCDTSTA ([M:SOH0]SOHNUM,[M:SOH0]BPCORD,[M:SOH0]CHGTYP,0,"",[M:SOH0]ORDDAT,[M:SOH2]UNL, 2,[M:SOH1]CDTSTA,GBIDD1,GBIDD1)
    #& From TRTVENCDT
    #[F:SOH]CDTSTA=[M:SOH1]CDTSTA
    ## Bug 64124
    ##------------------------------------------#
    ## Modification des acomptes de la commande #
    ##------------------------------------------#
    #If MODPTE=1 | MODPTE=3
    #    #----- Suppression des acomptes existants
    #    Call ACOMPTES(5,2,[F:SOH]SOHNUM,[F:SOH]LINNBR,[F:SOH]PTE,[F:SOH]ORDDAT,[F:SOH]ORDINVNOT,[F:SOH]ORDINVATI,
    #&                 [F:SOH]CUR,0,"","","",1,OK) From TRTTPT
    #    If GOK<1 Return : Endif
    #Endif
    #If MODPTE=1
    #    #----- Récréation des acomptes
    #    Call ACOMPTES(5,1,[F:SOH]SOHNUM,[F:SOH]LINNBR,[F:SOH]PTE,[F:SOH]ORDDAT,[F:SOH]ORDINVNOT,[F:SOH]ORDINVATI,
    #&                 [F:SOH]CUR,[F:SOH]CHGTYP,[F:SOH]BPCINV,[F:SOH]BPCPYR,[F:SOH]BPAPYR,
    #&                 1,OK) From TRTTPT
    #    If GOK < 1 Return : Endif
    #Endif
    ##--CPO 82311 Acomptes sur commande et modification du client facturé ou du tiers payeur
    #If MODPTE<>1 and MODPTE<>3 and (MODBPCINV=1 | MODBPCPYR=1)
    #  Gosub UPDATE_DUD_SOH_MODBPC From SUBSOHB
    #If GOK<1 Return : Endif
    #Endif
    #Raz MODBPCINV,MODBPCPYR
    ##--/CPO
    #
    ##LSE 07/08/2006
    ##Incrémentation des étapes avant-vente de l'affaire
    #Local Integer IERRINF
    #Local Integer ICHAPTER
    #Local Integer IBRETOUR
    #IBRETOUR=1
    #Call ADDOPPSTE("SOH", [M:SOH1]PREOPP, [M:SOH1]PJT,IERRINF,ICHAPTER,IBRETOUR) From SUBOPPB
    #If IBRETOUR=0
    #    GMESSAGE = mess(IERRINF, ICHAPTER, 1)
    #    GERR = 1
    #    GOK = 0
    #Endif
    #If GOK < 1 : Return : Endif
    #
    ##--------------------------------------------------------------------#
    ## Création des contrats de service liés à la cde      CRM 18.09.2000 #
    ##--------------------------------------------------------------------#
    ## FGR 13/02/2013 : X3SUIVI96419 (début) : déplacé depuis $APRES_MOD
    #Local Char LREP(GLONREP)
    #Local Integer NI
    #Local Integer NE
    #
    #  If dim([M:SOH1]REP(0)) > 0 Then
    #    LREP = [M:SOH1]REP(0)
    #  Endif
    #  Call CRECONSER([M:SOH0]SOHNUM, [M:SOH0]SALFCY, [M:SOH0]BPCORD, [M:SOH1]BPCINV, LREP, [M:SOH0]ORDDAT, [M:SOH0]CUR) From SUBCONB1
    #  If GERR = 1 Then
    #    GOK = 0
    #    Return
    #  Endif
    #  # Et suppression de ceux dont les lignes ont été supprimées
    #  For NI = 0 To [M:SOH0]NBCON-1
    #    # On regarde si le contrat est toujours dans SOH4
    #    NE = find([M:SOH0]CONUMDEL(NI), [M:SOH4]CONUM(0..[M:SOH4]NBLIG-1))
    #    If NE = 0 Then
    #      # Si on ne l'a pas trouvé c'est qu'on doit le supprimer
    #      Call DELSOHCON(2, [M:SOH0]SOHNUM, [M:SOH0]CONUMDEL(NI)) From SUBCONB1
    #    Endif
    #  Next NI
    ## FGR 13/02/2013 : X3SUIVI96419 (début)
    #
    ## Detail local tax data
    #If func AFNC.ACTIV("LTA") & GLOCUSATAX
    #  Gosub CREMOD_LTV From TRTTAXUSA
    #  If GOK < 1 : Return : Endif
    #Endif
    #
    ## Maj des statistiques
    #Call VALSTA("SOH",1) From SUBPS2
    #If GOK < 1 : Return : Endif
    #
    #Gosub DEVERROU_SQH
    #
    ##--CPO 79343
    #If GSOHSUPPLIGDSP>0
    #  Call MESSAGE(mess(251,191,1)) From GESECRAN
    #  Raz GSOHSUPPLIGDSP
    #Endif
    ##--/CPO
    #
    #Return
    
    ####################################################################
    $APRES_MOD
    Local Char TBPAR(10)(1..50),TBVAL(30)(1..50),WSAV_GLE
    #Local Char LREP(GLONREP)  # FGR 13/02/2013 : X3SUIVI96419 : déplacé dans $MODIF
    
    #- X3Suivi S71065, 79777
    WSAV_GLE = GCLE
    # V6 Affectations
    Gosub MAJ_MTO_AP_ALL From SALMTOLIB
    GCLE=WSAV_GLE
    
    #--------------------------------------------------------------------#
    # Création des contrats de service liés à la cde      CRM 18.09.2000 #
    #--------------------------------------------------------------------#
    ## FGR 13/02/2013 : X3SUIVI96419 : déplacé dans $MODIF
    #If dim([M:SOH1]REP(0))>0 LREP=[M:SOH1]REP(0) Endif
    #Call CRECONSER([M:SOH0]SOHNUM, [M:SOH0]SALFCY, [M:SOH0]BPCORD, [M:SOH1]BPCINV, LREP, [M:SOH0]ORDDAT, [M:SOH0]CUR) From SUBCONB1
    
    #--------------------------------------------------------------------#
    # Gestion des points                                  CRM 24.09.2003 #
    #--------------------------------------------------------------------#
    Local Integer IERRINF
    #LSE 21/03/2005 rajout 2 paramètres
    Local Integer ICHAPTER
    Local Integer IBRETOUR
    IERRINF = 0
    ICHAPTER= 0
    IBRETOUR= 1
    
    Call SOHPOINT([M:SOH0]SOHNUM, IERRINF, ICHAPTER, IBRETOUR) From TRTPOINT
    If IERRINF
        GMESSAGE = mess(IERRINF, ICHAPTER, 2)
        GERR = 1
    Endif
    
    #--------------------------------------------------------------------#
    # Incrémentation des étapes avant-vente de l'affaire  CRM 22.10.2003 #
    #--------------------------------------------------------------------#
    #LSE 07/08/2006 déplacer dans création
    #Call ADDOPPSTE("SOH", [M:SOH1]PREOPP, [M:SOH1]PJT) From SUBOPPB
    
    #--------------------------------------------------------------------#
    # Impression bon de commande                                         #
    #--------------------------------------------------------------------#
    If [F:SOH]OCNFLG=2 & WSLTDOCFLG=2 & [F:SOH]OCNPRN<>2
       Gosub SET_CLE From GOBJSUB
       CLECUR = 1
    Endif
    If [F:SOH]OCNFLG=2 & WSLTDOCFLG=2 & [F:SOH]OCNPRN<>2 & !GIMPORT
       # Issue X3-242198 - 2021-05-11 by SR : Save the previous value of REPORT1
       Local Char  WREPORT1(GLONARP) : WREPORT1 = [L]REPORT1
       If [M:SOH0]DOCNAM<>""
          [L]REPORT1=[M:SOH0]DOCNAM
       Elsif WSLTDOCNAM<>""
          [L]REPORT1=WSLTDOCNAM
       Endif
       Call ETAT([L]REPORT1,"GESSOH",TBPAR,TBVAL) From ETAT
       # Issue X3-242198 - 2021-05-11 by SR : Restore the previous value of REPORT1
       [L]REPORT1 = WREPORT1
    Endif
    
    # 117129 - Move SE and SST web service calls outside of transactions
    Gosub RECALC_SST From SUBSOHA1
    
    # 78411 Sage Exchange
    # If auth exists, check for need for re-auth, If no auth exists, authorize
    # If no longer SE PTE, Void any current auths
    If func AFNC.ACTIV("SEPP")
      If !clalev([F:SEU])  Local File SEAUTH [SEU] Endif
      If func SEPPLIB.SEPP_DOC([F:SOH]PTE)
      Call AUTH_CHK(2,[F:SOH]SOHNUM,GERR,GMESSAGE) From SEPPLIB
        If GERR
          If [F:SEU]MANAUT=2
            Call MESSAGE(mess(48,2092,1)) From GESECRAN
          Endif
          Call SDCDTSTA([M]SOHNUM,[M]BPCORD,[M]CHGTYP,0,[M:SOH1]CUR,[M]ORDDAT,[M]UNL,1,[M]CDTSTA,[M]OST,[M]OSTAUZ) From TRTVENCDT
          Affzo [M:SOH1]CDTSTA
          GOK=0 : Return
        Endif
        If !func SEPPCDT.SEPP_OK(2,[M:SOH0]SOHNUM,1) & [M:SOH1]CDTSTA<>4
        Call CALL_SEAUTH(2,[M:SOH0]SOHNUM) From TRTSEAUTH
      Endif
      Elsif func SEPPCDT.SEPP_OK(2,[M:SOH0]SOHNUM,1)
        Local Integer SERR
        Local Char    SEMESSAGE(150)
        Call VOID_ALL(2,[M:SOH0]SOHNUM,SERR,SEMESSAGE) From SEPPLIB
        If SERR : Call ERREUR (SEMESSAGE) From GESECRAN : Endif
      Endif
    Endif
    
      # -------------------------------------------------
      # Issue X3-31898 - 2017-11-23 by FGR : BEGIN
      # Issue X3-18442/120906 - 2017-01-13 by FGR : BEGIN
      #Gosub PJM_ORDERS_SOQQTY From SUBSOHA1
      # Issue X3-18442/120906 - 2017-01-13 by FGR : END
      # Issue X3-31898 - 2017-11-23 by FGR : END
      # -------------------------------------------------
    
    If !GIMPORT
        # Maintenant on fait toujours un gosub RELIT
        Gosub RELIT From GOBJSUB
        [M:SOH0]SOHNUM = [F:SOH]SOHNUM
    Else
        # If faut repasser dans liens même en import pour recalculer l'état de la commande
        Gosub LIENS From TABLEAUX
    Endif
      Raz CHG_FLG #Issue X3-X3-249553 by SDEM
    Return
    
    ###############################################################
    $VERF_ANU
    #----------------------------------------#
    # Controle de suppression d'une commande #
    #----------------------------------------#
    
    # --> Commande non supprimable si livrée ou facturée
    If [F:SOH]DLVSTA <> 1 | [F:SOH]INVSTA <> 1
        GERR=1 : GMESSAGE=mess(15,192,1) : OK=0 : Return
    Endif
    # --> Commande non supprimable si en préparation
    If sum([M:SOH4]LPRQTY,[M:SOH4]OPRQTY,[M:SOH4]PREQTY) <> 0
        GERR=1 : GMESSAGE=mess(54,123,1)-"\"-mess(310,192,1) : OK=0 : Return
    Endif
    # --> Commande non supprimable si elle a été générée sur autre site
    If [F:SOH]ORIFCY<>"" & [F:SOH]ORIFCY<>[F:SOH]SALFCY
        GERR=1 : GMESSAGE=mess(54,123,1)-":"-mess(862,196,1) : OK=0 : Return
    Endif
    # --> pas de suppression si ligne allouee
    If sum([M:SOH4]ALLQTYSTU) | sum([M:SOH4]SHTQTYSTU)
        OK=2 : Call AVERTIR(mess(119,191,1)-":"-mess(205,100,1), OK) From GESECRAN
        If OK=1 OK=0 : Return : Endif
    Endif
    # --> Commande non supprimable s'il existe des contremarque pour cette cde
    If sum([M:SOH4]FMINUM) <> ""
        OK=1 : Call AVERTIR(mess(53,191,1),OK) From GESECRAN
        If OK=1 OK=0 : Return Endif
    Endif
    # --> Gestion des signatures
    # Commande signée : Annulation des signatures existantes, modification ?
    If find([F:SOH]APPFLG, 2,3)
       OK=2 : Call AVERTIR(mess(229,191,1)+"\"+mess(53,123,1)-"?",OK) From GESECRAN
       If OK=1 OK=0 : Return : Endif
    Endif
    # --> Controle qu'aucun acompte n'a été versé
    Call ACOMPTES(5,3,[F:SOH]SOHNUM,[F:SOH]LINNBR,[F:SOH]PTE,[F:SOH]ORDDAT,[F:SOH]ORDINVNOT,[F:SOH]ORDINVATI,
    &            [F:SOH]CUR,0,"","","",1,OK) From TRTTPT
    If OK=0 Return Endif
    # --> Ce document est associé à une proforma
    If [F:SOH]PRFNUM <> ""
        GERR=2 : GMESSAGE=mess(106,191,1)-[F:SOH]PRFNUM
    Endif
    
      # FGR 30/04/2013 : X3SUIVI63021 (début) : déplacé dans AV_ANNULE
      #----------------------------------------------#
      #Modif CRM 07/09/2001
      #----------------------------------------------#
      #Suppression des contrats de service associés.
      #If GMODU(12) = 2 Then
      #  # FGR 27/04/2009 : X3SUIVI54600 : Pas le peine de le faire chez ceux qui n'ont pas le "Support client"
      #Endif
      # FGR 30/04/2013 : X3SUIVI63021 (fin) : déplacé dans AV_ANNULE
      # FGR 29/04/2013 : X3SUIVI89648 (début)
      If GMODU(12) = G_YES Then
        Local Char SSREMSG(type(GMESSAGE)-10)
    
        Call VERIF_SRE_COV([M:SOH0]SOHNUM, SSREMSG) From SUBSREB3
        If SSREMSG <> "" Then
          GERR = 1
          GMESSAGE = SSREMSG
          OK = 0
          Return
        Endif
      Endif
      # FGR 29/04/2013 : X3SUIVI89648 (fin)
    
    # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan  - 2020-07-16 by LD
    # The sales order is not deletable if a line is associated to a billing plan
    If dim([M:SOH4]PRGBILNUM)> 0
        If sigma(indcum=0,[M:SOH4]NBLIG-1,[M:SOH4]PRGBILNUM(indcum)<>"")<>0
          Local Integer WI : WI=0
          While WI<[M:SOH4]NBLIG & [M:SOH4]PRGBILNUM(WI)=""
            WI+=1
          Wend
          If WI<[M:SOH4]NBLIG
            GERR=1 : OK=0 : GMESSAGE = mess(54,123,1)-":"-func AFNC.MES1(mess(291,191,1),num$([M:SOH4]SOPLIN(WI)))-[M:SOH4]PRGBILNUM(WI) : Return
          Endif
        Endif
    Endif
    # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan  - 2020-07-16 by LD
    Gosub VERF_ANU_SO_LINE From SUBSOHA1  #Issue X3-243729 by SDEM
    Return
    
    # 101874 : V9 : Taxe code control
    # Move in SUBSOHA1
    #########################################################################
    #$AV_ANNULE
    #  # -------------------------------------------------------------------
    #  # FGR 30/04/2013 : X3SUIVI63021 (début) : déplacement depuis VERF_ANU
    #  #Suppression des contrats de service associés.
    #  If GMODU(12) = 2 Then
    #    # FGR 27/04/2009 : X3SUIVI54600 : Pas le peine de le faire chez ceux qui n'ont pas le "Support client"
    #    Local Integer ZF
    #    Local Integer IFOUNDCON
    #    Local Integer IFOUNDSIV  # FGR 20/09/2007 : X3SUIVI22621
    #    Local Integer ICHOIX
    #
    #    ICHOIX = 2
    #    IFOUNDCON = 0
    #    IFOUNDSIV = 0            # FGR 20/09/2007 : X3SUIVI22621
    #    #Recherche tout d'abord si un ou plusieurs contrats de maintenance ont été créés au travers de la commande.
    #    For ZF = 0 To [M:SOH4]NBLIG-1
    #      If [M:SOH4]CONNUM(ZF) <> "" Then
    #        IFOUNDCON = 1
    #        Filter [SID] Where [F:SID]CONNUM = [M:SOH4]CONNUM(ZF)
    #        For [SID] Hint Key SID4
    #          IFOUNDSIV += 1
    #          Break
    #        Next
    #        Filter [SID]
    #        If IFOUNDSIV Then
    #          # FGR 24/04/2009 : X3SUIVI54600 : Pas la peine de continuer : s'il y en a UN on n'a pas le droit de supprimer
    #          Break
    #        Endif
    #      Endif
    #    Next
    #    If IFOUNDSIV Then
    #      # FGR 20/09/2007 : X3SUIVI22621 On test si des factures (quel que soit leur statut) existent sur les
    #      #                  contrats. S'il y en a, on interdit la suppression de la commande.
    #      # Un ou plusieurs contrats ont été facturés. Suppression de la commande interdite.
    #      GERR = 1 : GMESSAGE = mess(944,196,1) : OK = 0 : Return
    #    Else
    #      #Demande si l'utilisateur souhaite supprimer les contrats associés.
    #      If IFOUNDCON Then
    #        Call OUINON(mess(456,196,1), ICHOIX) From GESECRAN  #Souhaitez-vous supprimer les contrats de service associés ?
    #        If ICHOIX = 2 Then #Réponse OUI
    #          #Supprime tous les contrats associées et leurs éléments.
    #          For ZF = 0 To [M:SOH4]NBLIG-1
    #            If [M:SOH4]CONNUM(ZF) <> "" Then
    #              Call DELSOHCON(2, [M:SOH0]SOHNUM, [M:SOH4]SOPLIN(ZF)) From SUBCONB1
    #            Endif
    #          Next
    #        Endif
    #      Endif
    #    Endif
    #  Endif
    #  # FGR 29/04/2013 : X3SUIVI63021 (fin) : déplacement depuis VERF_ANU
    #  # -----------------------------------------------------------------
    #  # V6 Affectations
    #  Gosub SUP_MTO_AV_ALL From SALMTOLIB
    #Return
    # 101874
    
    # 101874 : V9 : Taxe code control
    # Move in SUBSOHA1
    ################################################################
    #$ANNULE
    ##------------------------------------------#
    ## Annulation d'une commande                #
    ##------------------------------------------#
    #
    #Local Decimal  WQUOATI, WQUONOT : # En devis
    #Local Integer WRET
    #
    ## Raz des variables utilisées pour la maj des mvts clients
    #Raz WQUONOT, WQUOATI
    #
    ##----------------------------------------------------------------#
    ## Suppression des enregistrements sans SVCRVAT et SVCRFOOT       #
    ##----------------------------------------------------------------#
    #Call UPD_VALORISATION ("A","SOH") From TRTVENFACC
    #If GOK<1 Return Endif
    #
    #If left$([F:SOH]SOHTEX1,3)="SOH"
    #   Call SUP_CLOB([F:SOH]SOHTEX1,WRET) From TRTX3TEX
    #Endif
    #If left$([F:SOH]SOHTEX2,3)="SOH"
    #   Call SUP_CLOB([F:SOH]SOHTEX2,WRET) From TRTX3TEX
    #Endif
    #
    ##-----------------------------------------------------------------#
    ## Suppression des enr. historiques VOH VOP VOQ VOC  (avenants)    #
    ##-----------------------------------------------------------------#
    #Gosub SUP_HISTO
    #If GOK < 1 : Return : Endif
    #
    ##------------------------------------------#
    ## --> Mise à jour des mouvements clients   #
    ##------------------------------------------#
    #If sum([M:SOH4]SQDLIN) <> 0
    #    If clalev([F:SOP1])=0 Local File SORDERP[SOP1] Endif
    #    If clalev([F:SOQ1])=0 Local File SORDERQ[SOQ1] Endif
    #Endif
    #Gosub ANNULE From TABLEAUX : # Effacement des lignes
    #If GOK<1 : Return : Endif
    #
    ## --> Gestion des signatures
    ##------------------------------------------------------------------------#
    ## Positionnement indicateur "Annulé" sur les lignes de suivi de workflow #
    ##------------------------------------------------------------------------#
    #If GAPPSOH>1
    #  Call ANNULE_SUIVI("SOH",mess(653,197,1),1,WRET) From TRTVENDIV
    #  If GOK<1  Return : Endif
    #Endif
    #
    #If sum([M:SOH4]SQDLIN) <> 0
    #    Close Local File [SOP1]
    #    Close Local File [SOQ1]
    #    Default File [SOH]
    #Endif
    #
    ##----------------------------------------------------------------#
    ## ACA - Suppression des enr. analytiques des elts de facturation #
    ##----------------------------------------------------------------#
    #[M:SIHV]VCRTYP=20 : [M:SIHV]NUM=[F:SOH]SOHNUM
    #Gosub ANU_DIE_FOOT From SUBSIHV
    #If GOK < 1 : Return : Endif
    #
    ##-- Maj de l'encours des commandes ---#
    #Local Char WSENS, WGREP
    #WSENS='-'  : WGREP=''
    #Gosub MAJ_ENCOURS
    #If GOK<1: Return: Endif
    #
    ##----- Suppression des acomptes liés à cette commande
    #Call ACOMPTES(5,2,[F:SOH]SOHNUM,[F:SOH]LINNBR,[F:SOH]PTE,[F:SOH]ORDDAT,[F:SOH]ORDINVNOT,[F:SOH]ORDINVATI,
    #&                 [F:SOH]CUR,0,"","","",1,OK) From TRTTPT : If GOK<1 Return : Endif
    #
    ## Detail local tax data
    #If func AFNC.ACTIV("LTA") & GLOCUSATAX
    #  Gosub CREMOD_LTV From TRTTAXUSA
    #  If GOK < 1 : Return : Endif
    #Endif
    #
    ## 78411 Sage Exchange
    #If func AFNC.ACTIV("SEPP") & func SEPPLIB.SEPP_DOC([M:SOH3]PTE)
    #  Call VOID_ALL(2,[F:SOH]SOHNUM,GERR,GMESSAGE) From SEPPLIB
    #  If GERR : GOK=0 : Return : Endif
    #Endif
    #
    ## Maj des statistiques
    #Call VALSTA("SOH",-1) From SUBPS2
    #If GOK < 1 : Return : Endif
    #Return
    # 101874
    
    #------------------------------------------------------------------------
    $SUP_HISTO
    If clalev([F:VOH])=0 : Local File VSORDER    [VOH] : Endif
    If clalev([F:VOP])=0 : Local File VSORDERP   [VOP] : Endif
    If clalev([F:VOQ])=0 : Local File VSORDERQ   [VOQ] : Endif
    If clalev([F:VOC])=0 : Local File VSORDERC   [VOC] : Endif
    If clalev([F:CAL])=0 : Local File CPTANALIN  [CAL] : Endif #--CPO 103128 Record from CPTANALIN must also be deleted
    
    Delete [VOH] Where SOHNUM=[F:SOH]SOHNUM
    Delete [VOP] Where SOHNUM=[F:SOH]SOHNUM
    Delete [VOQ] Where SOHNUM=[F:SOH]SOHNUM
    Delete [VOC] Where SOHNUM=[F:SOH]SOHNUM
    
    Delete [CAL] Where ABRFIC="VOP" and VCRNUM=[F:SOH]SOHNUM  #--CPO 103128 Record from CPTANALIN must also be deleted
    
    Return
    
    ###############################################################
    $CHARGESOP
    #-----------------------------------------------#
    # Chargement ligne avant le write ou le rewrite #
    #-----------------------------------------------#
    If dim([F:SOP]CPY)>0 : [F:SOP]CPY=GSOCIETE : Endif
    [F:SOP]STOFCY    =  [M:SOH4]DSTOFCY(nolign-1)
    [F:SOP]VACITM(0) =  [M:SOH4]VACITM1(nolign-1)
    [F:SOP]VACITM(1) =  [M:SOH4]VACITM2(nolign-1)
    [F:SOP]VACITM(2) =  [M:SOH4]VACITM3(nolign-1)
    [F:SOP]VAT(0)    =  [M:SOH4]VAT1(nolign-1)
    [F:SOP]VAT(1)    =  [M:SOH4]VAT2(nolign-1)
    [F:SOP]VAT(2)    =  [M:SOH4]VAT3(nolign-1)
    [F:SOP]BPAADD    =  [M:SOH4]DBPAADD(nolign-1)
    [F:SOP]SQHNUM    =  [M:SOH4]DETSQHNUM(nolign-1)
    [F:SOP]INVCND    =  [M:SOH4]DINVCND(NOL)    : # 107890 : Scheduled invoices : (LD:08/12/15)
    
    If dim([M:SOH4]TSICOD1)>0: [F:SOP]TSICOD(0) = [M:SOH4]TSICOD1(nolign-1): Endif
    If dim([M:SOH4]TSICOD2)>0: [F:SOP]TSICOD(1) = [M:SOH4]TSICOD2(nolign-1): Endif
    If dim([M:SOH4]TSICOD3)>0: [F:SOP]TSICOD(2) = [M:SOH4]TSICOD3(nolign-1): Endif
    If dim([M:SOH4]TSICOD4)>0: [F:SOP]TSICOD(3) = [M:SOH4]TSICOD4(nolign-1): Endif
    If dim([M:SOH4]TSICOD5)>0: [F:SOP]TSICOD(4) = [M:SOH4]TSICOD5(nolign-1): Endif
    Return
    
    ###############################################################
    $CHARGESOQ
    
    #------------------------------------------------------#
    # Chargement ligne avant le write ou le rewrite        #
    # Alimentation des zones de SORDERQ à partir du masque #
    #------------------------------------------------------#
    
    # Cas particulier où on modifie le texte en le supprimant
    Local Integer WRET
    If [M:SOH4]SOQTEX(NOL)="" & left$([F:SOQ]SOQTEX,3)="SOQ"
        Call SUP_CLOB([F:SOQ]SOQTEX,WRET) From TRTX3TEX
    Endif
    
    [F:SOQ]          =  [M:SOH4]
    If dim([F:SOQ]CPY)>0 : [F:SOQ]CPY=GSOCIETE : Endif
    [F:SOQ]BPAADD    =  [F:SOP]BPAADD
    [F:SOQ]STOFCY    =  [M:SOH4]DSTOFCY(NOL)
    [F:SOQ]DLVPIO    =  [M:SOH4]DDLVPIO(NOL)
    [F:SOQ]BPTNUM    =  [M:SOH4]DBPTNUM(NOL)
    [F:SOQ]MDL       =  [M:SOH4]DMDL(NOL)
    [F:SOQ]DRN       =  [M:SOH4]DDRN(NOL)
    [F:SOQ]DAYLTI    =  [M:SOH4]DDAYLTI(NOL)
    [F:SOQ]DEMDLVDAT =  [M:SOH4]DDEMDLVDAT(NOL)
    [F:SOQ]SHIDAT    =  [M:SOH4]DSHIDAT(NOL)
    [F:SOQ]ALLTYP    =  [M:SOH4]DALLTYP(NOL)
    [F:SOQ]CCLREN    =  [M:SOH4]DCCLREN(NOL)
    [F:SOQ]CCLDAT    =  [M:SOH4]DCCLDAT(NOL)
    # Issue X3-38651
    # PJT has changed : We need to update ORDERS
    If [F:SOQ]PJT<>[M:SOH4]DPJT(NOL)
        If [M:SOH4]WIPFLG(NOL) = "" [M:SOH4]WIPFLG(NOL) = "M" : Endif
    Endif
    # End issue X3-38651
    [F:SOQ]PJT       =  [M:SOH4]DPJT(NOL)       : # 71065 : PJT
    
    If [F:SOH]BETFCY=2 & [F:SOH]ORIFCY<>"" & [F:SOH]ORIFCY<>[F:SOH]SALFCY
        [F:SOQ]POHNUM =  [F:SOH]CUSORDREF
        [F:SOQ]POPLIN =  [M:SOH4]POPLIN(NOL)
        [F:SOQ]POQSEQ =  1
    Endif
    
    # Ini SAM 120075 (JUCON 29/11/16)
    If func AFNC.ACTIV("EDIX3")
      If [M:SOH4]MAXDLVDAT(NOL)=[00/00/00]
        [M:SOH4]MAXDLVDAT(NOL) =  [M:SOH4]DDEMDLVDAT(NOL)
        [F:SOQ]MAXDLVDAT       =  [M:SOH4]MAXDLVDAT(NOL)
      Endif
    Endif
    # End SAM 120075 (JUCON 29/11/16)
    
    #LTA.sn
    # If GLOCUSATAX   # 106867.o
    If func AFNC.ACTIV("LTA") & [F:CPY]SSTTAXACT = 2   # 106867.n
      #Check from address, if different
      If [F:SOQ]STOFCY <> [F:SOH]STOFCY
        Call CHECK_FRADR([F:SOQ]STOFCY,1,WRET) From TRTADRLIB
      Endif
      # Check delivery address, if different
      If [F:SOQ]BPAADD <> "" and [F:SOQ]BPAADD <> [F:SOH]BPAADD
          Call CHECK_LIN_TOADR(1, [F:SOH]BPCORD, [F:SOQ]BPAADD) From TRTADRLIB
      Endif
    Endif
    #LTA.en
    # Calcul de la zone complémennt priorité de livraison
    [F:SOQ]DLVPIOCMP=9-[F:SOQ]DLVPIO
    
    If [M:SOH4]SOQTEX(NOL)<>""
       If left$([M:SOH4]SOQTEX(NOL),3)="SOQ"
          Call CRE_CLOB([M:SOH4]SOQTEX(NOL),GOK) From TRTX3TEX
          If GOK<1 Return Endif
       Elsif !find(left$([M:SOH4]SOQTEX(NOL),3),"ITU","ITS")
          Call DUP_CLOB("SOQ",[M:SOH4]SOQTEX(NOL),GOK) From TRTX3TEX
          If GOK<1 Return Endif
       Endif
       [F:SOQ]SOQTEX = [M:SOH4]SOQTEX(NOL)
    Endif
    
    # Récupération du chrono pour les en-cours
    If [F:ITM]ITMREF <> [M]ITMREF(NOL)
       Read [ITM] ITM0=[M]ITMREF(NOL)
       If fstat Raz [F:ITM] Endif
    Endif
    # 91786
    # Mise à jour des encours Si cde signée ou Si Paramètre maj encours article cde non signée à "Oui"
    #If [F:SOQ]STOMGTCOD <> 1 & [F:SOQ]DEMNUM = ""
    If [F:SOQ]STOMGTCOD <> 1 & [F:SOQ]DEMNUM = "" & ([F:SOH]APPFLG>2 | GSOHAPPORD=2)
    # 91786
        Call NUMERO(GWIP,[F:SOQ]STOFCY,[F:SOQ]ORDDAT,"",[F:SOQ]DEMNUM,STAT) From SUBANM
        If GOK<0 Return Endif
        If STAT <> 0
    #       Call ERREUR(GWIP-mess(60,199,1)) From GESECRAN
            GERR=1 : GMESSAGE = GWIP-mess(60,199,1)
       Endif
    Endif
    
    # V6.1 : Le code prépa est rendu saisissable, l'init se fait en AM_ITMREF
    ## Initialisation du code prépa
    #Local Char    WTSCCOD(GLONADI) (0..5)
    #Local Char    WTSICOD(GLONADI) (0..5)
    #Local Integer I
    #If dim([M:SOH0]TSCCOD) <> -1
    #    For I = 1 To dim([M:SOH0]TSCCOD)
    #        WTSCCOD(I-1) = [M:SOH0]TSCCOD(I-1)
    #    Next I
    #Endif
    #If dim([M:SOH4]TSICOD1)>0: WTSICOD(0) = [M:SOH4]TSICOD1(nolign-1): Endif
    ##If dim([M:SOH4]TSICOD2)>0: WTSICOD(1) = [M:SOH4]TSICOD2(nolign-1): Endif
    #If dim([M:SOH4]TSICOD3)>0: WTSICOD(2) = [M:SOH4]TSICOD3(nolign-1): Endif
    #If dim([M:SOH4]TSICOD4)>0: WTSICOD(3) = [M:SOH4]TSICOD4(nolign-1): Endif
    #If dim([M:SOH4]TSICOD5)>0: WTSICOD(4) = [M:SOH4]TSICOD5(nolign-1): Endif
    #If [F:BPC]BPCNUM<>[M:SOH0]BPCORD
    #   Read [BPC]BPC0=[M:SOH0]BPCORD
    #   If fstat Raz [F:BPC] Endif
    #Endif
    #Call REC_PRECOD([M:SOH4]DSTOFCY(NOL),[M:SOH4]ITMREF(NOL),[F:ITM]TCLCOD,WTSICOD(0),
    #&               WTSICOD(1),WTSICOD(2),WTSICOD(3),WTSICOD(4),[M:SOH0]BPCORD,
    #&               [F:BPC]BCGCOD,WTSCCOD(0),WTSCCOD(1),WTSCCOD(2),WTSCCOD(3),
    #&               WTSCCOD(4),[F:SOQ]PRECOD) From STKLIB
    
    # Stockage a la ligne des elt de facturation
    Call UPD_DSPLIN("SOQ",NOL) From TRTVENFACC
    
    Return
    
    ###############################################################
    $VERIF
    Local Shortint RES
      # Issue X3-160406 - 2019-10-11 by SR : In all cases, all Customers must be active
      Raz RES
      Call CTLBPCSTA([M:SOH0]BPCORD,1,RES) From TRTVENCTL
      If RES = 1 : GERR=1 : OK=0 : Return : Endif
      Call CTLBPCSTA([M:SOH1]BPCINV,2,RES) From TRTVENCTL
      If RES = 1 : GERR=1 : OK=0 : Return : Endif
      # End issue X3-160406
      # VPO 07/12/10 68435 verifier valeur Condition de paiement, Code escompte, Regime de taxe
      # VPO 01/03/11 71999 ameliorer message d'erreur
      If [M:SOH1]VACBPR<>""
        mkstat=0
        # 71937 : Multilégislation
        #Call CONTADI([M:SOH1]VACBPR,"1","") From SUBADI
        #If mkstat : GERR=1 : OK=0 : GMESSAGE=mess(32,126,1)-'"'+func AFNC.INTCLE("AMZ","SOH1~VACBPR")+'"\'+GMESSAGE : Return : Endif
        #Call CONTROLE("ADI","",[M:SOH1]VACBPR,"1",RES) From CONTOBJ
        #If RES : GERR=1 : OK=0 : GMESSAGE=mess(32,126,1)-'"'+func AFNC.INTCLE("AMZ","SOH1~VACBPR")+'"\'+GMESSAGE : Return : Endif
        Call CONTTVB([M:SOH1]VACBPR,GCURLEG,"SOH1","VACBPR",[M:SOH0]SALFCY,"","") From SUBTVB
        If mkstat : GERR=1 : OK=0 : GMESSAGE=mess(32,126,1)-'"'+func AFNC.INTCLE("AMZ","SOH1~VACBPR")+'"\'+GMESSAGE : Return : Endif
        # 71937 : Multilégislation
        mkstat=0
        Call C_VACBPR([M:SOH1]VACBPR) From SUBSOH
        If mkstat : GERR=1 : OK=0 : GMESSAGE=mess(32,126,1)-'"'+func AFNC.INTCLE("AMZ","SOH1~VACBPR")+'"\'+GMESSAGE : Return : Endif
      Endif
      If [M:SOH3]PTE<>""
        # TODAN-120946.sn
        # Check if the payment term is CC and one of the line is not deliverable...
        If func SEPPLIB.SEPP_DOC([M:SOH3]PTE)
          If [M:SOH4]NBLIG > 0 and find(1, [M:SOH4]DLVFLG(0..[M:SOH4]NBLIG-1))
            GERR=1 : OK = 0 : GMESSAGE= mess(62,2092,1)  # Credit card payment is prohibited when a line contains an invoicing term.
            Return
          Endif
        Endif
        # TODAN-120946.en
    
        #MAE, Exi 71937
        #Call CONTROLE("TPT","",[M:SOH3]PTE,"",RES) From CONTOBJ
        #If RES : GERR=1 : OK=0 : GMESSAGE=mess(32,126,1)-'"'+func AFNC.INTCLE("AMZ","SOH3~PTE")+'"\'+GMESSAGE : Return : Endif
        #-- X3Suivi 71937 : Données par législation pour le Conditions de paiement
        #--CPO 71937 01/08/2013 Suite dev review
        Call CONTTPT ([M:SOH3]PTE,GCURLEG,'','',[M:SOH0]SALFCY,'','') From SUBTPT
        If mkstat : GERR=1 : OK=0 : GMESSAGE=mess(32,126,1)-'"'+func AFNC.INTCLE("AMZ","SOH3~PTE")+'"\'+GMESSAGE : Return : Endif
        # FGR 22/07/2013 : X3SUIVI87923 (début)
        Call CTRL_PTE_SEPA_SDD([M:SOH3]PTE, GSOCIETE, [M:SOH1]BPCPYR) From TRTVENSDD
        If mkstat Then
          GERR = 1
          OK = 0
          GMESSAGE = mess(32,126,1)-'"'+func AFNC.INTCLE("AMZ","SOH3~PTE")+'"\'+GMESSAGE
          Return
        Endif
        # FGR 22/07/2013 : X3SUIVI87923 (fin)
        Gosub CHECK_TPT_FOR_PREPAYMENT_INVOICES From SUBSOHA1 # Issue X3-247735 by MRDAB
      Endif
      If [M:SOH3]DEP<>""
        #--CPO 71937 TABDEPAGIO
        #Call CONTROLE("TDA","!",[M:SOH3]DEP,"",RES) From CONTOBJ
        #If RES : GERR=1 : OK=0 : GMESSAGE=mess(32,126,1)-'"'+func AFNC.INTCLE("AMZ","SOH3~DEP")+'"\'+GMESSAGE : Return : Endif
        Call CONTTDA([M:SOH3]DEP,GCURLEG,"SOH3","DEP",[M:SOH0]SALFCY,"","") From SUBTDA
        If mkstat : GERR=1 : OK=0 : GMESSAGE=mess(32,126,1)-'"'+func AFNC.INTCLE("AMZ","SOH3~DEP")+'"\'+GMESSAGE : Return : Endif
        #--/CPO
      Endif
      # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
      If [M:SOH3]INVCND<>""
        Call CONTINVCND([M:SOH3]INVCND,GCURLEG,"SOH3","INVCND",[M:SOH0]SALFCY,"","") From SUBINVCND
        If mkstat : GERR=1 : OK=0 : GMESSAGE=mess(32,126,1)-'"'+func AFNC.INTCLE("AMZ","SOH3~INVCND")+'"\'+GMESSAGE : Return : Endif
      Endif
      Gosub VERIF From LIBSAL_INVCND_SOH
      # End issue 107888
    
      If dim(GWEBSERV)=1 & GWEBSERV=1
        #  Etiquette de création des gratuits       en mode Web Service
        Gosub TRTCREGRA_WEBSERV From TRTVENBOM
        # Issue 107888 - 2016-09-09 by CPO : US150 Free products not deliverable invoicing
        #TODO 107888 US150 içi, création échéancier ? ou alors, faut-il le faire dans le TRTCREGRA_WEBSERV ?
        #  Etiquette de création d'une nomenclature en mode Web Service
        Gosub TRTCRENOM_ADAPI From TRTVENBOM
        # Issue 107888 - 2016-09-09 by CPO : US155 Kit & flexible kit scheduled invoices
        #TODO 107888 US155 içi, création échéancier ? ou alors, faut-il le faire dans le TRTCRENOM_WEBSERV ?
      Endif
    
      #---------------------------------------------------#
      # Verifications et traitements avant creation/modif #
      #---------------------------------------------------#
    # FGR 08/10/2014 : X3SUIVI 103220 (début)
    #Local Char    CHAINE, WMESS(80)
    Local Char WMESS(80)
    If dim(CHAINE) <= 0 Then
      Local Char CHAINE(250)
    Endif
    # FGR 08/10/2014 : X3SUIVI 103220 (fin)
    Local Integer RET
    Local Char    SVMESSAGE(250)
    Local Integer NE             # FGR 13/08/2014 : X3SUIVI93839
    Local Char SAXECTRL(GLONCCE) # FGR 13/08/2014 : X3SUIVI93839
    
      If GREP="D"
        # --> Ctrl particulier en dupli. pour l'euro : vérifier que ce n'est pas une devise "in"
        Call CONTDEV([M:SOH1]CUR,[M:SOH0]ORDDAT) From TRTDEV
        If mkstat GERR=1 : GMESSAGE : OK=0 : Return : Endif
        # Issue X3-160406 - 2019-10-11 by SR : already done above
        # --> Ctrl particulier en dupli. : Ctrl client commande inactif
        #     Car le client commande est non modifiable en dupli. : Pas de passage en action ctrl bpcord
        #If [F:BPC]BPCNUM <> [M:SOH0]BPCORD
        #  Read [BPC]BPC0 = [M:SOH0]BPCORD
        #  If fstat Raz [F:BPC] : Endif
        #Endif
        #If [F:BPC]BPCSTA <> 2
        #  GERR=1 : GMESSAGE = mess(194,192,1)
        #  OK=0 : Return
        #Endif
        # End issue X3-160406
        # --> Commande inter-site : Demande de confirmation en dupplication
        #     Le client commande est aussi le fsseur (correspond au site de vente)
        If [M:SOH1]BETFCY=2 & [M:SOH0]BPCORD=[M:SOH0]BPSNUM
          Local Integer WOK : WOK=1
          Call AVERTIR (mess(151,191,1), WOK)From GESECRAN
          If WOK=1  GERR=1 : OK=0 : Return : Endif
        Endif
    
        # Issue X3-44998 - 2017-07-27 by CPO : Duplicated sale documents: analytical dimension not controlled (idem X3SUIVI93839)
        #--This control has to be done also during Creation/Update of a document
        #If func AFNC.ACTIV("ANA")>0 # SAM 119859 (X3-7678 JUCON 21/11/2013)
        #  # -------------------------------------
        #  # FGR 13/08/2014 : X3SUIVI93839 (début)
        #  For I = 0 To [M:SOH3]NBAXE-1
        #    If [M:SOH3]CCE(I) <> "" Then
        #      nolign = I + 1
        #      Call C_CCE([M:SOH3]CCE(I)) From W1SOH3
        #      If mkstat Then
        #        OK = 0
        #        Break
        #      Endif
        #    Endif
        #  Next
        #  If OK = 0 Then
        #    Return
        #  Endif
        #  # FGR 13/08/2014 : X3SUIVI93839 (fin)
        #Endif # SAM 119859 (X3-7678 JUCON 21/11/2016)
        # End issue X3-44998
    
        # -------------------------------------
        # Vérification que les articles sont actifs
        For I=0 To [M:SOH4]NBLIG-1
          Read [ITM]ITM0=[M:SOH4]ITMREF(I)
          If [F:ITM]ITMSTA = 6
            GERR=1 : GMESSAGE = [M:SOH4]ITMREF(I)-":"-mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")"
            OK=0 : Break
          Endif
          # 89275 : Duplication cde et ctrl des prix
          If GDACLOK=1
            GNETMAR=1
            Call CTLNETPRI([M:SOH0]BPCORD, [M]CHGTYP, [M]ORDDAT, [M:SOH0]CUR,I) From TRTVENPRI
            If mkstat=2 OK=0 : Break Endif
            Call CTLPFM([M:SOH0]CUR,[M:SOH4]CPRPRI(I), I) From TRTVENPRI
            If mkstat=2 OK=0 : Break Endif
          Endif
          # 89275
    
          # Issue X3-44998 - 2017-07-27 by CPO : Duplicated sale documents: analytical dimension not controlled (idem X3SUIVI93839)
          #--This control has to be done also during Creation/Update of a document (moved below)
          # -------------------------------------
          # FGR 13/08/2014 : X3SUIVI93839 (début)
          #For NE = 1 To 20
          #  If evalue("type([M:SOH4]CCE" + num$(NE) + "(I)) >= 0") Then
          #    SAXECTRL = evalue("[M:SOH4]CCE" + num$(NE) + "(I)")
          #    If SAXECTRL <> "" Then
          #      # Issue X3-44998 - 2017-07-27 by CPO : Duplicated sale documents: analytical dimension not controlled (idem X3SUIVI93839)
          #      #Call CTRL_CCE(SAXECTRL, NE, "", GFINRSP, [M:SOH0]ORDDAT) From TRTX3CPT
          #      nolign = I + 1
          #      #--for the ENAFLG flag
          #      Call CONTSEL("CCE","!",SAXECTRL,num$(GDIE(NE)),mkstat) From CONTOBJ
          #      If !mkstat
          #        Call CTRL_CCE(SAXECTRL, NE, "", GFINRSP, [M:SOH0]ORDDAT) From TRTX3CPT
          #      Endif
          #      # End issue X3-44998
          #      If mkstat Then
          #        OK = 0
          #        GMESSAGE = mess(162,154,1)-[M:SOH4]ITMREF(I)-":"-GMESSAGE # Issue X3-44998 - 2017-07-27 by CPO : Duplicated sale documents: analytical dimension not controlled (idem X3SUIVI93839)
          #        Break
          #      Endif
          #    Endif
          #  Endif
          #Next NE
          #If OK = 0 Then
          #  Break
          #Endif
          # FGR 13/08/2014 : X3SUIVI93839 (fin)
          # -------------------------------------
          # End issue X3-44998
        Next I
        GNETMAR=0 : # 89275
        If OK=0 Return Endif
      Endif
      If [M:SOH0]SALFCY<>[M:SOH2]STOFCY
        Read [FCY]FCY0=[M:SOH2]STOFCY
        #   If fstat | [F:FCY]LEGCPY<>GSOCIETE
        If fstat
          Raz [F:FCY] : Call RSTA ("FCY",[M:SOH2]STOFCY) From GLOCK : OK=0 : Return
        Endif
        If dim(GVENFLG01)<=0 | (dim(GVENFLG01)>0 & GVENFLG01<>1)
          If [F:FCY]LEGCPY<>GSOCIETE
            GERR=1 : GMESSAGE=mess(2,194,1) : OK=0 : Return
          Endif
        Endif
      Endif
      #VPO 28/08/09 51875 verif SHIDAT affichee
      # Issue X3-125879 - 2019-05-09 by SR : Only if SHIPDAT not enterable
      #If [M:SOH2]SHIDAT<>[0/0/0]
      If varmode([M:SOH2]SHIDAT) <> 0 &  [M:SOH2]SHIDAT<>[0/0/0]
        mkstat=0
        Local Char    PARVALUES(250)(1..20) , SAUVACT(20)
        Call C_SHIDAT([M:SOH2]SHIDAT) From SUBSOH
        If mkstat : GERR = 1 : OK=0 : Return : Endif
    
        SAUVACT = GACTION : GACTION = "CTLDATORD"
        PARVALUES(1) = [M:SOH0]ORDDAT
        Local Date    VALUEDAT
        VALUEDAT = [M]SHIDAT
        Call S_AFF_DAT(VALUEDAT,PARVALUES,"CTLDATORD","TRTVENCTL","") From GACTION
        GACTION = SAUVACT
        If mkstat : GERR = 1 : OK=0 : Return : Endif
    
        SAUVACT = GACTION : GACTION = "CTLUVYFCY"
        PARVALUES(1) = [M]STOFCY
        PARVALUES(2) = "1"
        Local Date    VALUEDAT
        VALUEDAT = [M]SHIDAT
        Call S_AFF_DAT(VALUEDAT,PARVALUES,"CTLUVYFCY","TRTVENCTL","") From GACTION
        GACTION = SAUVACT
        If mkstat : GERR = 1 : OK=0 : Return : Endif
      Endif
    
      # Si transformation d'un devis avec prospect il est possible que la condition de paiement soit à ""
      If [M:SOH3]PTE=""   GMESSAGE = mess(265,192,1) : GERR=1 : OK=0 : Return : Endif
    
      #--> Vérification que tous les axes entête ont bien été saisis (s'ils sont saisissables)
      If GHEADIE = 1 : # Axes entêtes saisissables (Initialisé par GETCPY)
        If dim([M]NBAXE)>0
          For nolign = 1 To GNBDIE
            If [M]CCE(nolign-1)="" & GOBLDIE(nolign)=2
              GERR=1 : GMESSAGE = mess(177,199,1) : OK = 0 : Break
            Endif
          Next nolign
        Endif
        If OK = 0 Return Endif
      Endif
    
      # X3-69134 : Performance enhancements for sales order import : X3-74053 : Analytical dimensions management (LD:05/29/18)
      # For import, as it has been done in SUBSOH.C_CCEX, it is not necessary to redo it
      If !GIMPORT & !GWEBSERV
      # X3-69134 : Performance enhancements for sales order import : X3-74053 : Analytical dimensions management (LD:05/29/18)
          # Issue X3-44998 - 2017-07-27 by CPO : Duplicated sale documents: analytical dimension not controlled (idem X3SUIVI93839)
          #--This control has to be done also during Creation/Update of a document (moved outside GREP="D")
          Gosub VERIF_CTL_ALLCCE From SUBSOHA1
          If OK=0 : Return : Endif
          # End issue X3-44998
      # X3-69134 : Performance enhancements for sales order import : X3-74053 : Analytical dimensions management (LD:05/29/18)
      Endif
      # X3-69134 : Performance enhancements for sales order import : X3-74053 : Analytical dimensions management (LD:05/29/18)
    
    # 107890 : Scheduled invoices : (LD:08/12/15)
    Local Integer WI, WJ
    WJ=find(1,[M:SOH4]DLVFLG(0..[M:SOH4]NBLIG-1))
    If [M:SOH0]SOHCAT=1 & WJ<>0
        # Invoicing condition is mandatory for undeliverable item
        For WI=WJ-1 To [M:SOH4]NBLIG-1
          If [M:SOH4]DLVFLG(WI)=1 & [M:SOH4]DINVCND(WI)=""
            GERR=1 : GMESSAGE = [M:SOH4]ITMREF(WI)-":"-mess(865,197,1)-":"-mess(864,197,1)
            OK=0 : Break
          Endif
        Next I
        If OK = 0 Return Endif
    Endif
    # 107890 : Scheduled invoices : (LD:08/12/15)
    
      # FGR 13/03/2014 : X3SUIVI97696 (début) déplacé après "Spécificité USA"
      #  # --> Contrôle En-cours autorisé atteint
      #  # Issue 73816 : No allocation if credit limit exceeded during order creation/modification
      #  #Local Decimal OSTNEW
      #  #OSTNEW = [M:SOH0]OST
      #  #If GOSTORD = 2
      #  #    OSTNEW += [M:SOH4]ORDATI
      #  #Endif
      #  Gosub CAL_OST
      #  If (OSTNEW > [M:SOH0]OSTAUZ)
      #      Call FMT_MNTCUR([M]OSTAUZ, [M]CUR, CHAINE) From TRTVENPRI
      #      OK=2 : GERR=3 : GMESSAGE = sum(mess(29,192,1), CHAINE, [M]CUR)
      #  Endif
      #  # --> Contrôle Montant mini de commande
      #  If [M:SOH4]NBLIG <> 0 & [M:SOH4]ORDNOT < [M:SOH0]ORDMINAMT
      #       Call FMT_MNTCUR([M]ORDMINAMT, [M]CUR, CHAINE) From TRTVENPRI
      #       WMESS = sum(mess(28,192,1), CHAINE, [M]CUR)
      #       If GDACLOK = 1
      #          GERR=1 : GMESSAGE=WMESS : OK=0 : Return
      #       Else
      #          If GERR = 3 GMESSAGE += " \ " Endif
      #          GERR=3 : GMESSAGE +=  WMESS
      #       Endif
      #  Endif
      #  If GERR=3 & GMESSAGE<>""
      #      Local Integer WOK : WOK=2 : Call AVERTIR(GMESSAGE, WOK) From GESECRAN
      #      Raz GMESSAGE, GERR : If WOK=1 OK=0 : GERR=1 : Return : Endif
      #  Endif
      # FGR 13/03/2014 : X3SUIVI97696 (fin)
    
      # --> Traitement des groupés s'il y a plus d'une ligne
      #                            si au moins une ligne a été modifiée
      If [M:SOH4]NBLIG >= 1 & (sum([M:SOH4]UPDFLG) <> 0 | [M:SOH4]NBLIG <> [F:SOH]LINNBR)
        # --> Pas de trt si une ligne est soldée
        # --> Pas de trt si la commande est livrée, facturée
        # --> Pas de trt si la commande est sur une liste de prépa ou préparée  : # 97383
        RET=1
        # 107888 : Scheduled invoices : (LD:19/05/16)
    #    If (find (3, [M:SOH4]SOQSTA(0..[M:SOH4]NBLIG-1)) <> 0 |
    #&      ([M:SOH1]DLVSTA <> 1 & [M:SOH0]SOHCAT <> 3)  |
    #&      ([M:SOH1]INVSTA <> 1 & [M:SOH0]SOHCAT  = 3)  |
    #&      (sum([M:SOH4]LPRQTY,[M:SOH4]OPRQTY,[M:SOH4]PREQTY)<>0))          : # 97383
        # --> Pas de trt si une ligne est soldée
        # Commande normale/prêt et il y a des lignes livrables
        # --> Pas de trt si la commande est sur une liste de prépa ou préparée  : # 97383
        # --> Pas de trt si la commande est livrée
        # Commande à facturation directe
        # Commande normale et ligne non livrable
        # --> Pas de trt si la commande est facturée
        If (find (3, [M:SOH4]SOQSTA(0..[M:SOH4]NBLIG-1)) <> 0 |
    &      ([M:SOH1]DLVSTA <> 1 & [M:SOH0]SOHCAT <> 3 & sum([M:SOH4]DLVFLG)<>[M:SOH4]NBLIG)  |
    &      ([M:SOH1]INVSTA <> 1 & ([M:SOH0]SOHCAT = 3 | sum([M:SOH4]DLVFLG)=[M:SOH4]NBLIG))  |
    &      (sum([M:SOH4]LPRQTY,[M:SOH4]OPRQTY,[M:SOH4]PREQTY)<>0))          : # 97383
        # 107888 : Scheduled invoices : (LD:19/05/16)
            RET=0
        Endif
        # Issue X3-200515/216443 - 2020-10-06 by MUARN : pas de trt si une ligne associée à un plan de facturation
        # ayant une échénance non facturée associé à une situation d'avancement
        # no trt if a scheduled invoice linked to a progress status not invoiced
        If dim([M:SOH4]PBILDTOINV) > 1 & RET = 1 & find(2,[M:SOH4]PBILDTOINV(0..[M:SOH4]NBLIG-1))
          RET = 0
        Endif
        # End issue X3-200515/216443
        If RET=1
          If GGRPPRI = 3 & !GIMPORT
            SVMESSAGE=GMESSAGE
            Call OUINON(mess(61,196,1), RET) From GESECRAN
            GMESSAGE=SVMESSAGE
          Endif
          If GGRPPRI = 2 | RET = 2
            Call RECH_GROUPE("SOH") From TRTVENTAR
            Gosub RECALC_GROUPE From SUBSOHB
            # Issue X3-38233 - 2019-03-14 by SR : GERR = 2 is not an error. It's a warning
            #If OK=0 or GERR>0 : OK=0 : Return : Endif # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
            If OK=0 or find(GERR,0,2) = 0 : OK=0 : Return : Endif
            # Optimisation 15/10/02
            #           Affzo [M:SOH0]1-99
            #           Affzo [M:SOH1]1-99
            #           Affzo [M:SOH4]1-99
          Endif
        Endif
      Endif
    
      # --> Il doit y avoir au moins une ligne
      #     Test fait après la rech. groupé si elle a supprimé des gratuits et nblig devient = à 0
      If [M:SOH4]NBLIG = 0
        GERR=1 : GMESSAGE = mess(61,199,1)
        OK=0
        Return        : # 104513 : Pb Sales Order creation without lines
      Endif
    
      # X3-69134 : Performance enhancements for sales order import / X3-91094 : Miscellaneous improvements (PJT, CRM calls) (LD:05/30/18)
      # Ctrl has to be done only if [M:SOH1]PJT or [M:SOH4]DPJT is fed
      If [M:SOH1]PJT<>"" | sigma(indcum=0, [M:SOH4]NBLIG-1, ([M:SOH4]DPJT(indcum)<>""))>0
      # X3-69134 : Performance enhancements for sales order import / X3-91094 : Miscellaneous improvements (PJT, CRM calls) (LD:05/30/18)
          # FGR 01/12/2011 : X3SUIVI71065 (début)
          Call PJT_CONTROLE_HEAD_DETAIL("[M:SOH1]PJT", "[M:SOH4]DPJT") From TRTPJT
          If GERR <> 0 Then
            OK = 0 :   Return
          Endif
          # FGR 01/12/2011 : X3SUIVI71065 (fin)
      # X3-69134 : Performance enhancements for sales order import / X3-91094 : Miscellaneous improvements (PJT, CRM calls) (LD:05/30/18)
      Endif
      # X3-69134 : Performance enhancements for sales order import / X3-91094 : Miscellaneous improvements (PJT, CRM calls) (LD:05/30/18)
    
      #   ------------------------------------------------------------- #
      #   Spécificité USA : Branchement du sous-pro de calcul des taxes #
      #   ------------------------------------------------------------- #
      #Call LECKUACT("KUA",RET) From TRTX3
      # If GLOCUSATAX   # 106867.o
      If func AFNC.ACTIV("LTA") & [F:CPY]SSTTAXACT = 2   # 106867.n
        Local Integer WTRA : WTRA=0
    #    If GTRACE="" Call OUVRE_TRACE(mess(322,197,1)) From LECFIC : WTRA=1 Endif  # 107858.o
        If !GIMPORT & !GWEBSERV & GTRACE=""  # 107858.sn
          Call OUVRE_TRACE(mess(322,197,1)) From LECFIC
          WTRA=1
        Endif  # 107858.en
        Call CLCTAXEUSA("SOH4", "2") From TRTTAXSST   # 106867.n
        # Call CLCTAXEUSA("SOH4", "2") From TRTTAXUSA   # 106867.o
        If !GIMPORT & !GWEBSERV  # 107858.n
          Call FERME_TRACE From LECFIC
        Endif  # 107858.n
    #    If GMESSAGE <> "" & !GIMPORT  # 107858.o
        If GMESSAGE <> "" & !GIMPORT & !GWEBSERV  # 107858.n
          Call OUINON(mess(322,197,1)-"\"-GMESSAGE+"\"+mess(88,191,1), RET) From GESECRAN
          If RET=2 Call LEC_TRACE From LECFIC : Endif
          Raz GMESSAGE
        Endif
    #    If !WTRA Call OUVRE_TRACE("") From LECFIC Endif  # 107858.o
        If !GIMPORT & !GWEBSERV & !WTRA  # 107858.sn
          Call OUVRE_TRACE("") From LECFIC
        Endif  # 107858.en
        Affzo [M:SOH4]1-99
      Endif
    
      #LTA.sn
      # If func AFNC.ACTIV("LTA") and GLOCUSATAX and func TRTADRLIB.CHKADR_MANDATORY()   # 106867.o
      If func AFNC.ACTIV("LTA") and [F:CPY]SSTTAXACT = 2 and func TRTADRLIB.CHKADR_MANDATORY()   # 106867.n
        Gosub CHKADR_ORDER From TRTADRLIB
        If GERR <> 0 Then
          OK = 0
          Return
        Endif
      Endif
      #LTA.en
    
      # FGR 13/03/2014 : X3SUIVI97696 (début) déplacé après "Spécificité USA"
      # --> Contrôle En-cours autorisé atteint
      # Issue 73816 : No allocation if credit limit exceeded during order creation/modification
      #Local Decimal OSTNEW
      #OSTNEW = [M:SOH0]OST
      #If GOSTORD = 2
      #    OSTNEW += [M:SOH4]ORDATI
      #Endif
      Gosub CAL_OST
      If (OSTNEW > [M:SOH0]OSTAUZ)
        Call FMT_MNTCUR([M]OSTAUZ, [M]CUR, CHAINE) From TRTVENPRI
        If !([M:SOH1]BETFCY = 2 & [M:SOH1]BETCPY <> 2) or GCTLBETFCY = 2 Then      # FGR 10/03/2015 : X3SUIVI23273 - Si pas (Intersit & non intersoc) ou si Ctrl intersit encours&prix
          OK = 2
          GERR = 3
          GMESSAGE = sum(mess(29,192,1), CHAINE, [M]CUR)
        Endif
      Endif
      # --> Contrôle Montant mini de commande
      If [M:SOH4]NBLIG <> 0 & [M:SOH4]ORDNOT < [M:SOH0]ORDMINAMT
        Call FMT_MNTCUR([M]ORDMINAMT, [M]CUR, CHAINE) From TRTVENPRI
        WMESS = sum(mess(28,192,1), CHAINE, [M]CUR)
        If GDACLOK = 1
          GERR=1 : GMESSAGE=WMESS : OK=0 : Return
        Else
          If GERR = 3 GMESSAGE += " \ " Endif
          GERR=3 : GMESSAGE +=  WMESS
        Endif
      Endif
      If GERR=3 & GMESSAGE<>""
        Local Integer WOK : WOK=2 : Call AVERTIR(GMESSAGE, WOK) From GESECRAN
        Raz GMESSAGE, GERR : If WOK=1 OK=0 : GERR=1 : Return : Endif
      Endif
      # FGR 13/03/2014 : X3SUIVI97696 (fin)
    
      #################################
      #Modif CRM    22/10/2003
      If GMODU(13) = 2
        Call SETMKGORI("SOH", [M:SOH1]PJT) From SUBOPPB
      Endif
      #################################
      #Modif CRM    24/09/2003
      Raz [F:SOQ]PITFLG
      #################################
      #Modif CRM    20/10/2003
      If GMODU(12) = 2
        Call SOHSRENUM From SUBSREB3
      Endif
    
      #85785 * RMA * document amount cannot be negative
      If func PORLEGLIB.DIGSIGN([M:SOH0]SALFCY, "") & ([M:SOH4]ORDINVATI<0)
        GERR = 1: GMESSAGE = mess(00216,00191,1) : OK = 0 : Return
      Endif
    
      If func AFNC.ACTIV("DKS") & GCURLEG ="POR" & !func PORLEGLIB.CONT_DATETIME(GREP,GFONCTION) : OK = 0 : GERR = 1 : Return : Endif
    
    Return
    
    ####################################################################
    # Issue 73816 : No allocation if credit limit exceeded during order creation/modification
    # --> Calcul En-cours
    $CAL_OST
    Local Decimal OSTNEW
    OSTNEW = [M:SOH0]OST
    # X3-218176 : Orders not put back to credit hold after lines added / X3-226050 - 2020-11-25 by LD
    # If valuation + Tax amount is increased and the sales order has been manually unblocked for credit hold
    # If the user don't have Authorization to unlock order
    # Credit control has to be done again to recalculate credit status
    #If GOSTORD = 2 OSTNEW += [M:SOH4]ORDATI Endif
    If GOSTORD = 2 & [M:SOH2]UNL<>2 OSTNEW += [M:SOH4]ORDATI Endif
    If dim(WSVG_ORDATI)>0
      If [M]ORDATI>WSVG_ORDATI & [M:SOH2]UNL=2 & GCDTUNL=1
        [M:SOH2]UNL=1
        Local Decimal WOST
        Call SDCDTSTA ([M:SOH0]SOHNUM,[M:SOH0]BPCORD,[M:SOH0]CHGTYP,0,[M:SOH0]CUR,[M:SOH0]ORDDAT,[M:SOH2]UNL,1,[M:SOH1]CDTSTA,WOST,GBIDD1) From TRTVENCDT
        If GOSTORD = 2 OSTNEW=WOST+[M:SOH4]ORDATI-WSVG_ORDATI Endif
      Endif
    Endif
    # X3-218176 : Orders not put back to credit hold after lines added / X3-226050 - 2020-11-25 by LD
    
    Return
    ####################################################################
    $CHARGENTETE
    #--------------------------------------------------#
    # Chargement de l'entete avant le Write ou Rewrite #
    #--------------------------------------------------#
    Local Integer I, WRET
    
    If dim([F:SOH]CPY)>0 : [F:SOH]CPY=GSOCIETE : Endif
    
    # Alimentation du numero d'avenant
    If GREV = 2:[F:SOH]REVNUM = [M:SOH0]REVNUM:Endif
    # Initialisation de la date de retour de prêt
    If dim([M:SOH1]LNDRTNDAT) > 0
       If [M:SOH0]SOHCAT = 2 & [M:SOH1]LNDRTNDAT = [0/0/0]
          [M:SOH1]LNDRTNDAT = addmonth([M:SOH0]ORDDAT,1)
          [F:SOH]LNDRTNDAT = [M:SOH1]LNDRTNDAT
       Endif
    Endif
    # Alimentation des types de frais/remises et des no éléments de facturation
    For I = 1 To dim([F:SOH]DISCRGTYP)
        [F:SOH]DISCRGTYP (I-1) = GDISCRGTYP (I-1)
        [F:SOH]INVDTALIN (I-1) = GINVDTALIN (I-1)
    Next I
    [F:SOH]LINNBR       = [M:SOH4]NBLIG
    # Alimentation des totaux
    [F:SOH]ORDNOT       = [M:SOH4]ORDNOT
    [F:SOH]ORDATI       = [M:SOH4]ORDATI
    [F:SOH]DLRNOT       = [M:SOH4]DLRNOT
    [F:SOH]DLRATI       = [M:SOH4]DLRATI
    [F:SOH]PFMTOT       = [M:SOH4]PFMTOT
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    [F:SOH]INRSCHNOT    = [M:SOH4]INRSCHNOT
    [F:SOH]INRSCHATI    = [M:SOH4]INRSCHATI
    [F:SOH]INRNOT       = [M:SOH4]INRNOT
    [F:SOH]INRATI       = [M:SOH4]INRATI
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    # Alimentation de l'adresse commande
    [F:SOH]CNTNAM = [M:ADB1]CNTNAM
    
    #If find([M:ADB1]ADBFLG,0,1) Call CHARGE_ADRMSK("ADB1", [F:SOH]BPCORD) From TRTVENDIV : Endif            : # Bug 67868
    If GACTSAD=2 & find([M:ADB1]ADBFLG,0,1) Call CHARGE_ADRMSK("ADB1", [F:SOH]BPCORD) From TRTVENDIV : Endif : # Bug 67868
    Gosub CHARGE_ADRBPC From SUBSOHB
    # Alimentation de l'adresse livraison
    [F:SOH]CNDNAM = [M:ADB2]CNTNAM
    
    #If find([M:ADB2]ADBFLG,0,1) Call CHARGE_ADRMSK("ADB2", [F:SOH]BPCORD) From TRTVENDIV : Endif            : # Bug 67868
    # If (GACTSAD=2 | GLOCUSATAX) & find([M:ADB2]ADBFLG,0,1) Call CHARGE_ADRMSK("ADB2", [F:SOH]BPCORD) From TRTVENDIV : Endif : # Bug 67868 # 106867.o
    If (GACTSAD=2 | (func AFNC.ACTIV("LTA") & [F:CPY]SSTTAXACT = 2)) & find([M:ADB2]ADBFLG,0,1) Call CHARGE_ADRMSK("ADB2", [F:SOH]BPCORD) From TRTVENDIV : Endif : # Bug 67868 # 106867.n
    Gosub CHARGE_ADRBPD From SUBSOHB
    # Alimentation de l'adresse facturation
    [F:SOH]CNINAM = [M:ADB3]CNTNAM
    #LTA.sn
    # If GLOCUSATAX and [F:SOH]ADRVAL <> 2   # 106867.o
    If func AFNC.ACTIV("LTA") and [F:CPY]SSTTAXACT = 2 and [F:SOH]ADRVAL <> 2   # 106867.n
        Call CHECK_DOC_TOADR(2, RET) From TRTADRLIB
        If RET = 0 : [F:SOH]ADRVAL = 2  : Endif
    Endif
    #LTA.en
    #If find([M:ADB3]ADBFLG,0,1) Call CHARGE_ADRMSK("ADB3", [F:SOH]BPCINV) From TRTVENDIV : Endif            : # Bug 67868
    If GACTSAD=2 & find([M:ADB3]ADBFLG,0,1) Call CHARGE_ADRMSK("ADB3", [F:SOH]BPCINV) From TRTVENDIV : Endif : # Bug 67868
    #If dim([M:ADB3]EECNUM)>0 [F:SOH]BPIEECNUM = [M:ADB3]EECNUM Endif
    Gosub CHARGE_ADRBPI From SUBSOHB
    
    # Alimentation des zones venant du client livré
    [F:SOH]STOFCY       = [M:SOH2]STOFCY
    [F:SOH]DLVPIO       = [M:SOH2]DLVPIO
    [F:SOH]DRN          = [M:SOH2]DRN
    [F:SOH]DAYLTI       = [M:SOH2]DAYLTI
    [F:SOH]MDL          = [M:SOH2]MDL
    [F:SOH]BPTNUM       = [M:SOH2]BPTNUM
    # Calcul du nombre de lignes soldées et de l'état solde
    Raz [F:SOH]CLELINNBR
    Raz [F:SOH]INVLINNBR
    # Issue X3-59732
    #For I=0 To [M]NBLIG-1
    For I=0 To [M:SOH4]NBLIG-1
    # End issue X3-59732
        If [M:SOH4]SOQSTA(I) = 3 : [F:SOH]CLELINNBR +=1 : Endif
        If [M:SOH4]INVFLG(I) = 2 : [F:SOH]INVLINNBR +=1 : Endif
    Next I
    If [F:SOH]CLELINNBR >= [F:SOH]LINNBR : [F:SOH]ORDSTA = 2 : Else:[F:SOH]ORDSTA=1 : Endif
    [M:SOH1]ORDSTA = [F:SOH]ORDSTA
    
    # 88452 - order holds import
    If dim([M:SOH1]HLDSTA)>0 & [M:SOH1]HLDSTA>1
      If [F:SOH]HLDUSR=""      : [F:SOH]HLDUSR = GUSER : Endif
      If [F:SOH]HLDDAT=[0/0/0] : [F:SOH]HLDDAT = date$ : Endif
      If [F:SOH]HLDTIM=""      : [F:SOH]HLDTIM = time$ : Endif
    Endif
    
    If [M:SOH0]SOHTEX1<>""
       If left$([M:SOH0]SOHTEX1,3)="SOH"
          Call CRE_CLOB([M:SOH0]SOHTEX1,GOK) From TRTX3TEX
          If GOK<1 Return Endif
       Elsif left$([M:SOH0]SOHTEX1,3)<>"BPC"
          Call DUP_CLOB("SOH",[M:SOH0]SOHTEX1,GOK) From TRTX3TEX
          If GOK<1 Return Endif
       Endif
       [F:SOH]SOHTEX1 = [M:SOH0]SOHTEX1
    Endif
    If [M:SOH0]SOHTEX2<>""
       If left$([M:SOH0]SOHTEX2,3)="SOH"
          Call CRE_CLOB([M:SOH0]SOHTEX2,GOK) From TRTX3TEX
          If GOK<1 Return Endif
       Elsif left$([M:SOH0]SOHTEX2,3)<>"BPC"
          Call DUP_CLOB("SOH",[M:SOH0]SOHTEX2,GOK) From TRTX3TEX
          If GOK<1 Return Endif
       Endif
       [F:SOH]SOHTEX2 = [M:SOH0]SOHTEX2
    Endif
    
    # Raz du no devis de l'entête commande s'il y en a plusieurs
    # Issue 112736 :
    # In Import mode, it is too early to do that here because
    # for lines [M:SOH4] is charged with the imported file in VALLIG called in CREATION and MODIF
    # and we can't do it in CREATION and MODIF because it's too late [F:SOH] is already updated
    # So we can't do that in Import mode
    If !GIMPORT
        If [F:SOH]SQHNUM <> ""
           For I=0 To [M:SOH4]NBLIG-1
              If [M:SOH4]DETSQHNUM(I)<>"" & [M:SOH4]DETSQHNUM(I) <> [F:SOH]SQHNUM
                 Raz [F:SOH]SQHNUM, [M:SOH3]SQHNUM
                 Break
              Endif
           Next I
           If sum([M:SOH4]DETSQHNUM(0..[M:SOH4]NBLIG-1)) = ""
              Raz [F:SOH]SQHNUM, [M:SOH3]SQHNUM
           Endif
        # Maj du no devis dans l'entête commande s'il n'y en a qu'une
        Else
            For I=0 To [M:SOH4]NBLIG-1
                If [M:SOH4]DETSQHNUM(I)<>""
                    If [M:SOH3]SQHNUM=""
                        [M:SOH3]SQHNUM=[M:SOH4]DETSQHNUM(I)
                        [F:SOH]SQHNUM=[M:SOH4]DETSQHNUM(I)
                    Elsif [M:SOH3]SQHNUM<>[M:SOH4]DETSQHNUM(I)
                        Raz [F:SOH]SQHNUM, [M:SOH3]SQHNUM
                        Break
                    Endif
                Endif
            Next I
        Endif
    Endif
    # End issue 112736
    
    # Alimentation des montants en devise société
    Call COURMNT([F:SOH]CUR,GLOCALDEV,GLOCALDEV,[F:SOH]CHGTYP,[F:SOH]ORDDAT,1,
    &            [F:SOH]ORDNOT,[F:SOH]ORDNOTL,[F:SOH]CHGRAT,WRET) From TRTDEV
    Call COURMNT([F:SOH]CUR,GLOCALDEV,GLOCALDEV,[F:SOH]CHGTYP,[F:SOH]ORDDAT,1,
    &            [F:SOH]ORDATI,[F:SOH]ORDATIL,[F:SOH]CHGRAT,WRET) From TRTDEV
    
    # ACA BPAPYR Initialisé avec :
    # si le tiers payeur de la commande est le tiers payeur du client commande :
    #   l'adresse du tiers payeur à partir de l'adresse du tiers payeur du client commande
    # sinon il faut prendre l'adresse par défaut du tiers payeur.
    Read [BPC]BPC0=[F:SOH]BPCORD
    If fstat Raz [F:BPC] Endif
    If [F:BPC]BPCPYR=[F:SOH]BPCPYR
      [F:SOH]BPAPYR=[F:BPC]BPAPYR
    Else
      Read [BPR]BPR0=[F:SOH]BPCPYR
      If fstat Raz [F:BPR] Endif
      [F:SOH]BPAPYR=[F:BPR]BPAADD
    Endif
    
    # 106776- EDI fields
    If func AFNC.ACTIV("EDIX3")
      If [F:SOH]DEMDLVHOU <> [M:SOH2]DEMDLVHOU
        [F:SOH]DEMDLVHOU = [M:SOH2]DEMDLVHOU
      Endif
    Endif
    
    Return
    
    ####################################################################
    $VERROU_SOH
    Local Char MACLCK(50), USRLCK(50) : # Bug 82375
    
    #--------------------------------------------------#
    # Verrouillage de la commande pour bouton          #
    #--------------------------------------------------#
    
    If dim (BOUT)>0
    
    #                                                        # hcb 97100 + 98749 deb
    Case BOUT
       When "6" :
    # pour resoudre ce bug le lock n est plus fait sur l entete mais sur les lignes
        For [SOQ]SOQ0 Where SOHNUM = [M:SOH0]SOHNUM
            SYMBOLE2 = "SOQ"+[F:SOQ]SOHNUM+"\"+num$([F:SOQ]SOPLIN)+"\"+num$([F:SOQ]SOQSEQ)
            Lock = SYMBOLE2
            If fstat
           # Modification en cours sur un autre poste
               GMESSAGE=[F:SOQ]SOHNUM+"\"+num$([F:SOQ]SOPLIN)+"\"+num$([F:SOQ]SOQSEQ)-":"-mess(10,100,1)
               GERR = 1
               Call QUILOCKE(SYMBOLE2,[L]MACLCK,[L]USRLCK) From OBJDIV
               If [L]USRLCK<>""
                  GMESSAGE -= "\"+mess(101,126,1)-":"-[L]USRLCK : # La fiche est utilisée par
               Endif
               Break
            Endif
        Next
       When "E", "F", "H", "J", "K", "L", "M", "1", "2", "3", "4" , "5" :
        SYMBOLE2 = "SOH"+[M:SOH0]SOHNUM
        Lock = SYMBOLE2
        If fstat
       # modification en cours sur un autre poste
           GERR = 1 : GMESSAGE=[M:SOH0]SOHNUM-":"-mess(10,100,1)
           Call QUILOCKE(SYMBOLE2,[L]MACLCK,[L]USRLCK) From OBJDIV
            If [L]USRLCK<>""
               GMESSAGE -= "\"+mess(101,126,1)-":"-[L]USRLCK : # La fiche est utilisée par
           Endif
        Endif
    #   When Default
    Endcase
    #                                                        # hcb 97100 + 98749 fin
    
    Else
        SYMBOLE2 = "SOH"+[M:SOH0]SOHNUM
        # X3-98359 Locked symbol after manual allocation (LCC-06/08/18)
        If dim(GLOCKSUP) # If dim(GLOCKSUP) -> The action is Manual Allocation
         Call QUILOCKE(SYMBOLE2,[L]MACLCK,[L]USRLCK) From OBJDIV #-> Test is the lock is already done
        Endif
        # End X3-98359 Locked symbol after manual allocation (LCC-06/08/18)
        Lock = SYMBOLE2
        If fstat
       # modification en cours sur un autre poste
           GERR = 1 : GMESSAGE=[M:SOH0]SOHNUM-":"-mess(10,100,1)
           Call QUILOCKE(SYMBOLE2,[L]MACLCK,[L]USRLCK) From OBJDIV
            If [L]USRLCK<>""
               GMESSAGE -= "\"+mess(101,126,1)-":"-[L]USRLCK : # La fiche est utilisée par
           Endif
        Endif
    Endif
    # X3-98359 Locked symbol after manual allocation (LCC-06/08/18)
    If dim(GLOCKSUP) # If dim(GLOCKSUP) -> The action is Manual Allocation
       If GERR=1 or [L]USRLCK<>""
        GLOCKSUP=2 # The lock has been done by the Supervisor
       Else
        GLOCKSUP=0 # The lock has been done by the action Manual Allocation
       Endif
    Endif
    # End X3-98359 Locked symbol after manual allocation (LCC-06/08/18)
    Return
    
    ####################################################################
    $DEVERROU_SQH
    #--------------------------------------------------#
    # Déverrouillage des devis bloqués par le picking  #
    #--------------------------------------------------#
    Local Integer I
    Local Char    SYMBOLE2(50)
    For I=0 To [M:SOH4]NBLIG-1
       If [M:SOH4]CREFLG(I)=0 & [M:SOH4]DETSQHNUM(I)<>""
          SYMBOLE2 = "SQH"+[M:SOH4]DETSQHNUM(I)
          Unlock = SYMBOLE2
       Endif
    Next I
    Return
    
    #----------------------------------------------------------------#
    # Activation/Desactivation des zones en fonction des codes acces #
    #----------------------------------------------------------------#
    #Read [ACC]CODACC = GUSER;"/SCDTUNL"
    #If fstat = 0 & [F:ACC]MODIF=1
    #    Diszo [M:SOH2]UNL
    #Else
    #    Actzo [M:SOH2]UNL
    #Endif
    #Read [ACC]CODACC = GUSER;"/SPRIMOD"
    #If fstat = 0 & [F:ACC]MODIF=1
    #    Diszo [M:SOH4]GROPRI
    #    If dim([M:SOH4]DISCRGVAL1) > 0 Diszo [M:SOH4]DISCRGVAL1 Endif
    #    If dim([M:SOH4]DISCRGVAL2) > 0 Diszo [M:SOH4]DISCRGVAL2 Endif
    #    If dim([M:SOH4]DISCRGVAL3) > 0 Diszo [M:SOH4]DISCRGVAL3 Endif
    #    If dim([M:SOH4]DISCRGVAL4) > 0 Diszo [M:SOH4]DISCRGVAL4 Endif
    #    If dim([M:SOH4]DISCRGVAL5) > 0 Diszo [M:SOH4]DISCRGVAL5 Endif
    #    If dim([M:SOH4]DISCRGVAL6) > 0 Diszo [M:SOH4]DISCRGVAL6 Endif
    #    If dim([M:SOH4]DISCRGVAL7) > 0 Diszo [M:SOH4]DISCRGVAL7 Endif
    #    If dim([M:SOH4]DISCRGVAL8) > 0 Diszo [M:SOH4]DISCRGVAL8 Endif
    #    If dim([M:SOH4]DISCRGVAL9) > 0 Diszo [M:SOH4]DISCRGVAL9 Endif
    #Else
    #    Actzo [M:SOH4]GROPRI
    #    If dim([M:SOH4]DISCRGVAL1) > 0 Actzo [M:SOH4]DISCRGVAL1 Endif
    #    If dim([M:SOH4]DISCRGVAL2) > 0 Actzo [M:SOH4]DISCRGVAL2 Endif
    #    If dim([M:SOH4]DISCRGVAL3) > 0 Actzo [M:SOH4]DISCRGVAL3 Endif
    #    If dim([M:SOH4]DISCRGVAL4) > 0 Actzo [M:SOH4]DISCRGVAL4 Endif
    #    If dim([M:SOH4]DISCRGVAL5) > 0 Actzo [M:SOH4]DISCRGVAL5 Endif
    #    If dim([M:SOH4]DISCRGVAL6) > 0 Actzo [M:SOH4]DISCRGVAL6 Endif
    #    If dim([M:SOH4]DISCRGVAL7) > 0 Actzo [M:SOH4]DISCRGVAL7 Endif
    #    If dim([M:SOH4]DISCRGVAL8) > 0 Actzo [M:SOH4]DISCRGVAL8 Endif
    #    If dim([M:SOH4]DISCRGVAL9) > 0 Actzo [M:SOH4]DISCRGVAL9 Endif
    #Endif
    #Diszo [M:SOH2]LASDLVNUM
    #Diszo [M:SOH3]PRFNUM, LASINVNUM,SQHNUM
    #Return
    ####################################################################
    $FIN_ACTION
    # Pour forcer un réaffichage de la commande
    If REPONSE=GSTALIT-1024 Gosub RELIT From GOBJSUB Endif
    
    # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line
    If find(REPONSE, GSTAENR, GSTACRE, GSTAANU)>0 or GREP=""
      If !GIMPORT and !GWEBSERV
        # Issue X3-128239
    #    If dim([M]WALLTXT)>0
    #      Raz [M]WALLTXT : Affzo [M]WALLTXT
    #    Endif
    #    If dim([M]WSTKTXT)>0
    #      Raz [M]WSTKTXT : Affzo [M]WSTKTXT
    #    Endif
        If dim([M:SOH4]WALLTXT)>0
          Raz [M:SOH4]WALLTXT : Affzo [M:SOH4]WALLTXT
        Endif
        If dim([M:SOH4]WSTKTXT)>0
          Raz [M:SOH4]WSTKTXT : Affzo [M:SOH4]WSTKTXT
        Endif
        # End Issue X3-128239
      Endif
    Endif
    # /User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO
    
    # Issue X3-243729 By SDEM
    If [V]GPREFUN = 2 and maxtab([V]GDEL_ARR)>-1 and find(REPONSE, GSTAENR, GSTACRE)>0
      Gosub UNLOCK_PREPAYMENT_CONTRACTS From SUBSOHA1
    Endif
    # Issue X3-243729 end
    Return
    
    #########################################################################
    #--------------------------------------------------------------------------#
    # Chargement des paramètres avec GFCY = Site de la commande                #
    # ------------------------------------------------------------------------ #
    # Chargement des globales référenciels, comptes et sections de la société  #
    # Chargement des paramètres de localisation                                #
    # ------------------------------------------------------------------------ #
    $CHARG_PARAM
    Local  Char     PARAM2(GLONADP)
    
    # --- Chargement des globales référenciels, comptes et sections de la société
    Call GETCPY(GFCY,"SLT",2,GFLAG) From TRTX3CPT
    # 106867.sn
    If func AFNC.ACTIV("LTA")
      Gosub GET_CPY_SSTTAXACT From TRTTAXSST
    Endif
    # 106867.en
    # --- Si changement société
    If GSOC_UPDFLG
        # --- Chargement des paramètres de localisation
        # --- Utilisation systeme de taxe
        # If func AFNC.ACTIV("KUS")   # 106867.so
        #    #-- 80866 Performance import
        #    #Call PARAM(GFCY,"USATAX",PARAM2) From ADOVAL
        #    Call PARAML(GFCY,"USATAX",PARAM2) From ADOVAL
        #    GLOCUSATAX=val(PARAM2)
        #    If GLOCUSATAX>0  GLOCUSATAX-=1 : Endif
        # Else
        #  Raz GLOCUSATAX
        # Endif   # 106867.eo
        If dim(OK)<1  Local Integer OK : Endif
        # --- Récupération du compteur des encours article
        Call LECTCA(7,OK) From SUBTCA
        If fstat | !OK
            GERR=1 : GMESSAGE=mess(58,105,1)-mess(7,14,1)-mess(250,199,1) : Return
        Endif
        GWIP=[F:TCA]CODNUM(8)
        # V6.2 : Certification
        # --- Contrôle date documents
        #-- 80866 Performance import
        #Call PARAM(GFCY,"CTLDATORI",PARAM2)    From ADOVAL
        Call PARAML(GFCY,"CTLDATORI",PARAM2)    From ADOVAL
        GCTLDATORI=val(PARAM2)  : If GCTLDATORI=0   GCTLDATORI=2  : Endif
    
        # FGR 28/11/2011 : X3SUIVI71065
        GPJTSNGDOC = func TRTPJT.GET_PARAM_PJTSNGDOC(GFCY)
    Endif
    #--- Prix / Montant HT/TTC                    : # 82808 : Modification champ PRITYP
    Call PARAML(GFCY,"NOTATI",PARAM2) From ADOVAL : # 82808
    GNOTATI = val(PARAM2)                         : # 82808
    
      # FGR 26/07/2013 : X3SUIVI87923 (début)
      If func AFNC.ACTIV("SDD") Then
        Call PARAML(GFCY, "SDDMGT", PARAM2) From ADOVAL      # FGR 28/07/2015 : X3SUIVI108078 : Plus Call PARAM (performances)
        GSDDMGT = val(PARAM2)
        If GSDDMGT <> 1 and GSDDMGT <> 2 Then
          GSDDMGT = 1
        Endif
      Endif
      # FGR 26/07/2013 : X3SUIVI87923 (fin)
      # FGR 23/02/2015 : X3SUIVI104383 (début)
      Call PARAMUTIL("SOHTYPNOR", PARAM2, GUSER, GFCY) From SUBAUS
      GSOHTYPNOR = PARAM2
      Call PARAMUTIL("SOHTYPINV", PARAM2, GUSER, GFCY) From SUBAUS
      GSOHTYPINV = PARAM2
      Call PARAMUTIL("SOHTYPLND", PARAM2, GUSER, GFCY) From SUBAUS
      GSOHTYPLND = PARAM2
      #Call PARAMUTIL("SOHTYPOPN", PARAM2, GUSER, GFCY) From SUBAUS
      #GSOHTYPOPN = PARAM2
      Call PARAMUTIL("QUOORDCAT", PARAM2, GUSER, GFCY) From SUBAUS
      GQUOORDCAT = val(PARAM2)
      # FGR 23/02/2015 : X3SUIVI104383 (fin)
    Return
    ##########################################################################################################
    #------------------------------------------------------------------------#
    # Affichage entêtes colonnes variables (comptes et sections analytiques) #
    #------------------------------------------------------------------------#
    $AFF_TITCOL
    If GSOC_UPDFLG & !GIMPORT & GFLAG<>"" & dim([M:SOH4]CCE1)>0
      Local Char BASPAG(10)
      BASPAG="NBLIG" : Gosub TIT_COL From ="W1WK2"+GFLAG+"4"
      #----- Pour forcer l'utilisation des formats évalués si tableau vide -----#
      # Affzo nécessaire si sections invisibles pour faire disparaitre les colonnes
      If [M:SOH4]NBLIG=0
        [M:SOH4]NBLIG=1 : Affzo [SOH4]5 : Effzo [SOH4]5
      Endif
      #-----
    Endif
    Raz GSOC_UPDFLG
    Return
    
    ##########################################################################################################
    #MAE, écran des commandes en création et alimenté par le client et le site via les navigations
    $AVANT_CHOI
      If GCREFONC = 1
        Local Char VALEUR
        REPONSE = GSTANEW
        Gosub NOUVEAU From GOBJSUB
        Gosub SETBOUT From GOBJSUB
        # FGR 18/02/2014 : X3SUIVI96940 ne pas faire le diszo : ça désactive les actions sur champ (contrôle, AM...)
        #Diszo [M:SOH0]BPCORD
        # FGR 18/02/2014 : X3SUIVI96940 empêche l'exécution du AM_BPCORD
        #GCREFONC = 0
        GCREFONC = 2
      Endif
    Return
    
    #########################################################################
    # 101380 - Setup SST Override related fields
    #########################################################################
    Subprog SETUP_SSTFIELDS
    
    # 106867.sn
    If func AFNC.ACTIV("LTA") & GSOCIETE<>[F:CPY]CPY
      Gosub GET_CPY_SSTTAXACT From TRTTAXSST
    Endif
    # 106867.en
    
    # If GLOCUSATAX   # 106867.o
    If func AFNC.ACTIV("LTA") & [F:CPY]SSTTAXACT = 2   # 106867.n
      Grizo [M:SOH4]VACITM1,VACITM2,VACITM3
      If dim([M:SOH4]SSTCOD)>0 :
        Chgfmt [M:SOH4]SSTCOD     With "K:"   + num$(type([M:SOH4]SSTCOD)-10)     + "B"     # Show enterable
        Chgfmt [M:SOH3]SFISSTCOD  With "K:"   + num$(type([M:SOH3]SFISSTCOD)-10)  + "B"     # Show enterable
        Actzo [M:SOH4]SSTCOD
      Endif
    Else
      Actzo [M:SOH4]VACITM1,VACITM2,VACITM3
      If dim([M:SOH4]SSTCOD)>0
        Chgfmt [M:SOH4]SSTCOD     With "-K:"  + num$(type([M:SOH4]SSTCOD)-10)     + "B"     # Hide
        Chgfmt [M:SOH3]SFISSTCOD  With "-K:"  + num$(type([M:SOH3]SFISSTCOD)-10)  + "B"     # Hide
      Endif
    Endif
    
    End
    
    #########################################################################
    # 101380 - Retrieve SST Code from source doc when copying from earlier document
    # Invoicing elements can be re-ordered or dropped due to transfer rules.
    #########################################################################
    Subprog RELOAD_SFISST
    Local Integer NEWELEM, SRCELEM, INBFAC
    
    # Should never get here without an SO attached, but just in case
    # If [M:SOH3]SQHNUM="" | !GLOCUSATAX : End : Endif   # 106867.o
    If [M:SOH3]SQHNUM="" | !(func AFNC.ACTIV("LTA")) | [F:CPY]SSTTAXACT <> 2 : End : Endif   # 106867.n
    
    INBFAC=[M:SOH3]NBFAC
    
    Local Char    OGSSTCOD(8) (INBFAC)
    Local Integer OGINVDTA    (INBFAC)
    
    #Get the elements from the order and store in local variables
    For SRCELEM=0 To INBFAC-1
      [L]OGINVDTA(SRCELEM) = [F:SQH]INVDTA(SRCELEM)
      [L]OGSSTCOD(SRCELEM) = [F:SQH]SFISSTCOD(SRCELEM)
    Next SRCELEM
    
    #Find the correct inv element on the SDH header and update the SSTCOD
    For NEWELEM=0 To INBFAC-1
      SRCELEM = find([F:SOH]INVDTA(NEWELEM), [L]OGINVDTA(0..INBFAC-1))
      If SRCELEM>0
        [F:SOH]SFISSTCOD(NEWELEM)=[L]OGSSTCOD(SRCELEM-1)
      Endif
    Next NEWELEM
    
    End
    #######################################################################################
    ## TODAN-120946. Validate the line to see if there is any non-deliverable item
    #######################################################################################
    $VALIDATE_INVOICING_TERM
    
      # Payment term was not SE and now SE. So check the line for non-deliverable item
      If !func SEPPLIB.SEPP_DOC([M:SOH3]PTE) & [M:SOH4]NBLIG > 0 & find(1, [M:SOH4]DLVFLG(0..[M:SOH4]NBLIG-1))
        GOK = -1 : GMESSAGE= mess(62,2092,1) : mkstat=2
      Endif
    
    Return
    ######################################################################################
    $SOHNUMEND_SET_VISIBILITY
    
    # Issue X3-135076 by ANKUL - drives visibility of fields for PT Signature
    If func AFNC.ACTIV('KPO') > 0
      Local Shortint SHOWFIELD #1 - reg; 2 - display; 3 - hidden
    
      If !clalev([F:SLT]) : Local File SALTRS [SLT] : Endif
    
      #set flg to show or hide the field
      If [F:SLT]STRTYP <> 2 | [F:SLT]STRNUM <> GFLAG
        Read [F:SLT]SLT0 = 2;GFLAG
      Endif
      If fstat : Raz [F:SLT] : Endif
      SHOWFIELD = [F:SLT]ELESGNCOD
    
      If dim([M:SOH1]SOHVALDATC) > 0 and dim([M:SOH1]SOHVALDAT) > 0 and [M:SOH1]SOHVALDAT <> [0/0/0]
        [M:SOH1]SOHVALDATC = format$("D:" + GFMDAT, [M:SOH1]SOHVALDAT)
      Endif
      If func PORLEGLIB.DIGSIGN("", [F:SOH]CPY)=1 and find(SHOWFIELD, 1, 2)
        Chgfmt [M:SOH1]SOHCFMFLG   With "LA1:15X"
        Chgfmt [M:SOH0]SOHNUMEND   With "K:" + num$(GLONVCR) + "X"
        Chgfmt [M:SOH1]SOHVALDATC  With "K:10X"
      Else
        If dim([M:SOH1]SOHCFMFLG) > 0 and dim([M:SOH0]SOHNUMEND) > 0 and dim([M:SOH1]SOHVALDATC) > 0
          Chgfmt [M:SOH1]SOHCFMFLG   With "-LA1:15X"
          Chgfmt [M:SOH0]SOHNUMEND   With "-K:" + num$(GLONVCR) + "X"
          Chgfmt [M:SOH1]SOHVALDATC  With "-K:10X"
        Endif
      Endif
    
      # Issue X3-177254 - 20200520 by VAVIL : Fields that user must be able to change after the Electronic Signature - orders
      If dim([M:SOH1]SOHCFMFLG) > 0 and dim([M:SOH0]SOHNUMEND) > 0 and dim([M:SOH1]SOHVALDAT) > 0
        If [M:SOH1]SOHCFMFLG = 2 and [M:SOH1]INVSTA <= 1 and [M:SOH1]ORDSTA = 1
          Diszo [M:SOH0]1-99 : Actzo [M:SOH0]SOHNUM
          # Issue X3-225917 - 20201209 by VAVIL : Sales order - we cannot change shipment site after the digital signature
          Diszo [M:SOH1]1-99 : Actzo [M:SOH1]PJT, REP, HLDSTA, HLDBTN, HLDCOD,CDTSTA,CDTBTN
          Diszo [M:SOH2]1-99 : Actzo [M:SOH2]DEMDLVDAT, SHIDAT, DAYLTI, DRN, MDL, BPTNUM, EECICT,ICTCTY,DME,ORDCLE,ODL,STOFCY # Issue end X3-225917
          Diszo [M:SOH3]1-99 : Actzo [M:SOH3]IME, INVCND, PTE
          If dim([M:SOH3]NBAXE)  > 0 Actzo [M:SOH3]NBAXE     Endif
          If dim([M:SOH3]DIE)    > 0 Actzo [M:SOH3]DIE       Endif
          If dim([M:SOH3]NAMDIE) > 0 Actzo [M:SOH3]NAMDIE    Endif
          If dim([M:SOH3]CCE)    > 0 Actzo [M:SOH3]CCE       Endif
    
          Diszo [M:SOH4]ITMREF,ITMDES,ITMDES1,SAU,QTY,SAUSTUCOE,STU,GROPRI,NETPRI
          If dim([M:SOH4]ECCVALMAJ) > 0 Diszo [M:SOH4]ECCVALMAJ Endif
          If dim([M:SOH4]ECCVALMIN) > 0 Diszo [M:SOH4]ECCVALMIN Endif
          If dim([M:SOH4]DSTOFCY)   > 0 Diszo [M:SOH4]DSTOFCY   Endif
          If dim([M:SOH4]LINREVNUM) > 0 Diszo [M:SOH4]LINREVNUM Endif
          If dim([M:SOH4]LINREVDAT) > 0 Diszo [M:SOH4]LINREVDAT Endif
          If dim([M:SOH4]SHTQTY)    > 0 Diszo [M:SOH4]SHTQTY    Endif
          If dim([M:SOH4]DALLTYP)   > 0 Diszo [M:SOH4]DALLTYP   Endif
          If dim([M:SOH4]TDLQTY)    > 0 Diszo [M:SOH4]TDLQTY    Endif
          If dim([M:SOH4]CPRPRI)    > 0 Diszo [M:SOH4]CPRPRI    Endif
          If dim([M:SOH4]PFM)       > 0 Diszo [M:SOH4]PFM       Endif
          If dim([M:SOH4]DINVCND)   > 0 Diszo [M:SOH4]DINVCND   Endif
          If dim([M:SOH4]SSTCOD)    > 0 Diszo [M:SOH4]SSTCOD    Endif
          If dim([M:SOH4]DBPAADD)   > 0 Diszo [M:SOH4]DBPAADD   Endif
          If dim([M:SOH4]FMI)       > 0 Diszo [M:SOH4]FMI       Endif
          If dim([M:SOH4]DEMSTA)    > 0 Diszo [M:SOH4]DEMSTA    Endif
          If dim([M:SOH4]DISCRGVAL1) > 0 Diszo [M:SOH4]DISCRGVAL1 Endif
          If dim([M:SOH4]DISCRGVAL2) > 0 Diszo [M:SOH4]DISCRGVAL2 Endif
          If dim([M:SOH4]DISCRGVAL3) > 0 Diszo [M:SOH4]DISCRGVAL3 Endif
          If dim([M:SOH4]DISCRGVAL4) > 0 Diszo [M:SOH4]DISCRGVAL4 Endif
          If dim([M:SOH4]DISCRGVAL5) > 0 Diszo [M:SOH4]DISCRGVAL5 Endif
          If dim([M:SOH4]DISCRGVAL6) > 0 Diszo [M:SOH4]DISCRGVAL6 Endif
          If dim([M:SOH4]DISCRGVAL7) > 0 Diszo [M:SOH4]DISCRGVAL7 Endif
          If dim([M:SOH4]DISCRGVAL8) > 0 Diszo [M:SOH4]DISCRGVAL8 Endif
          If dim([M:SOH4]DISCRGVAL9) > 0 Diszo [M:SOH4]DISCRGVAL9 Endif
          If dim([M:SOH4]VACITM1) > 0 Diszo [M:SOH4]VACITM1 Endif
          If dim([M:SOH4]VACITM2) > 0 Diszo [M:SOH4]VACITM2 Endif
          If dim([M:SOH4]VACITM3) > 0 Diszo [M:SOH4]VACITM3 Endif
          Diszo [M:SOH4]10,15,20,25,30
        Else
          # Issue X3-227574 - 2021-04-07 by JOPAU
          Actzo [M:SOH4]ITMREF,ITMDES,ITMDES1,SAU,QTY,SAUSTUCOE,STU,GROPRI,NETPRI
          If dim([M:SOH4]ECCVALMAJ)  > 0 Actzo [M:SOH4]ECCVALMAJ Endif
          If dim([M:SOH4]ECCVALMIN)  > 0 Actzo [M:SOH4]ECCVALMIN Endif
          If dim([M:SOH4]DSTOFCY)    > 0 Actzo [M:SOH4]DSTOFCY   Endif
          If dim([M:SOH4]LINREVNUM)  > 0 Actzo [M:SOH4]LINREVNUM Endif
          If dim([M:SOH4]LINREVDAT)  > 0 Actzo [M:SOH4]LINREVDAT Endif
          If dim([M:SOH4]SHTQTY)     > 0 Actzo [M:SOH4]SHTQTY    Endif
          If dim([M:SOH4]DALLTYP)    > 0 Actzo [M:SOH4]DALLTYP   Endif
          If dim([M:SOH4]TDLQTY)     > 0 Actzo [M:SOH4]TDLQTY    Endif
          If dim([M:SOH4]CPRPRI)     > 0 Actzo [M:SOH4]CPRPRI    Endif
          If dim([M:SOH4]PFM)        > 0 Actzo [M:SOH4]PFM       Endif
          If dim([M:SOH4]DINVCND)    > 0 Actzo [M:SOH4]DINVCND   Endif
          If dim([M:SOH4]SSTCOD)     > 0 Actzo [M:SOH4]SSTCOD    Endif
          If dim([M:SOH4]DBPAADD)    > 0 Actzo [M:SOH4]DBPAADD   Endif
          If dim([M:SOH4]FMI)        > 0 Actzo [M:SOH4]FMI       Endif
          If dim([M:SOH4]DEMSTA)     > 0 Actzo [M:SOH4]DEMSTA    Endif
          If dim([M:SOH4]DISCRGVAL1) > 0 Actzo [M:SOH4]DISCRGVAL1 Endif
          If dim([M:SOH4]DISCRGVAL2) > 0 Actzo [M:SOH4]DISCRGVAL2 Endif
          If dim([M:SOH4]DISCRGVAL3) > 0 Actzo [M:SOH4]DISCRGVAL3 Endif
          If dim([M:SOH4]DISCRGVAL4) > 0 Actzo [M:SOH4]DISCRGVAL4 Endif
          If dim([M:SOH4]DISCRGVAL5) > 0 Actzo [M:SOH4]DISCRGVAL5 Endif
          If dim([M:SOH4]DISCRGVAL6) > 0 Actzo [M:SOH4]DISCRGVAL6 Endif
          If dim([M:SOH4]DISCRGVAL7) > 0 Actzo [M:SOH4]DISCRGVAL7 Endif
          If dim([M:SOH4]DISCRGVAL8) > 0 Actzo [M:SOH4]DISCRGVAL8 Endif
          If dim([M:SOH4]DISCRGVAL9) > 0 Actzo [M:SOH4]DISCRGVAL9 Endif
          If dim([M:SOH4]VACITM1)    > 0 Actzo [M:SOH4]VACITM1 Endif
          If dim([M:SOH4]VACITM2)    > 0 Actzo [M:SOH4]VACITM2 Endif
          If dim([M:SOH4]VACITM3)    > 0 Actzo [M:SOH4]VACITM3 Endif
          Actzo [M:SOH4]10,15,20,25,30
          # End issue X3-227574
        Endif
      Endif
      # Issue X3-135076 end
      Endif
    # Issue X3-135076 end
    Return
    
    
    
    Subprog AS_SOHTYP(VALEUR)
    Variable Char    VALEUR()
    If GREP="" & VALEUR=""
        Local Char WSOHTYP(GLONTSO) : Local Integer  WSOHCAT
        Gosub SOHTYP From TRTVENCDE : VALEUR=WSOHTYP
    Endif
    End
    ######################################################################################
    ########################################
    Subprog C_SOHTYP(VALEUR)     : # --- Web - Obligatoire - Synchrone
    Variable Char    VALEUR()
    
    # --> Refuser les commandes de prêt si module non présent
    If [TSO]SOHCAT = 2 & dim([M:SOH1]LNDRTNDAT) < 0 : mkstat=2 : Endif
    # Bug 56725 : Interdire la saisie d'une commande inter-site de prêt
    ## --> En V150, une commande de prêt peut être inter-sites
    #If [TSO]SOHCAT = 2 & [M:SOH1]BETFCY=2 mkstat=2 : GMESSAGE=mess(291,192,1) : Endif
    
    #-- X3Suivi 75115 Libellé Catégorie --#
    [M:SOH0]SOHCAT=[F:TSO]SOHCAT
    [M:SOH0]WSOHCAT = mess(8,105,1) - ':' - mess([M:SOH0]SOHCAT,412,1)
    Affzo [M:SOH0]WSOHCAT
    
    Local Integer WLND    : WLND=[F:TSO]SOHCAT
    Local Integer WBETFCY : WBETFCY=[M:SOH1]BETFCY
    Gosub CTR_LNDBETFCY From SUBSOHB : If mkstat=2 End Endif
    # --> Refuser les commandes à facturation directe si commande intra-société
    If [TSO]SOHCAT = 3 & [M:SOH1]BETFCY=2 & [M:SOH1]BETCPY<=1 mkstat=2: GMESSAGE=mess(256,192,1) : Endif
    End
    ########################################
    Subprog AP_SOHTYP(VALEUR)     : # --- Web - Obligatoire - Synchrone
    Variable Char    VALEUR()
    [M:SOH0]SOHCAT=[F:TSO]SOHCAT
    
    If [F:TSO]CODNUM <> ""
        GMANCOU=[F:TSO]MANCOU : GCPT=[F:TSO]CODNUM
    Else
    #-- Aucun compteur associé au type de commande
        If !clalev([F:TCA])  Local File TABCOUAFF  [TCA] Endif
        Local Integer WRET
        Call LECTCA(5,WRET) From SUBTCA
        If fstat | !WRET
            GERR=1 : GMESSAGE=mess(58,105,1)-mess(5,14,1)-mess(250,199,1) : End
        Endif
    #   Compteur : Normale (9) Prêt (10) Facturation directe (11)
        GMANCOU = [F:TCA]MANCOU([F:TSO]SOHCAT+8) : GCPT = [F:TCA]CODNUM([F:TSO]SOHCAT+8)
    Endif
    # 107888 : Scheduled invoices : (LD:27/05/16)
    #If [M:SOH0]SOHCAT = 3
    If [M:SOH0]SOHCAT = 3 | ([M:SOH0]SOHCAT = 1 & sum([M:SOH4]DLVFLG) = [M:SOH4]NBLIG)
        # --> Commande à facturation directe
        # --> Commande normale et aucune ligne livrable
        # On grize les infos livraisons, elles n'ont pas de signification
    # 107888 : Scheduled invoices : (LD:27/05/16)
       Grizo [M:SOH1]DLVSTA
       Grizo [M:SOH2]LASDLVDAT
       Grizo [M:SOH2]LASDLVNUM
    Else
    # 107888 : Scheduled invoices : (LD:27/05/16)
       # --> Commande normale et il y a des lignes livrables
       # --> Commande de prêt
    # 107888 : Scheduled invoices : (LD:27/05/16)
       Diszo [M:SOH1]DLVSTA
       Diszo [M:SOH2]LASDLVDAT
       Diszo [M:SOH2]LASDLVNUM
    Endif
    If dim([M:SOH1]LNDRTNDAT) > 0
       If [M:SOH0]SOHCAT = 2
          Actzo [M:SOH1]LNDRTNDAT
       Else
          Grizo [M:SOH1]LNDRTNDAT
       Endif
    Endif
    
    # Bug 59281 : En webservice, le n°commande doit tjs être saisissable donc si GMANCOU=1 on raz le champ
    If GREP="C" & GMANCOU=1 & (dim(GWEBSERV)>1 & GWEBSERV=1) Effzo [M:SOH0]SOHNUM : Endif
    
    If GREP="C" & GMANCOU=1
        Diszo [M:SOH0]SOHNUM
    Else
        Actzo [M:SOH0]SOHNUM
    Endif
    
    End
    ########################################
    Subprog AM_SOHTYP(VALEUR)    : # --- Web - Obligatoire - Synchrone
    Variable Char    VALEUR()
    
    If GMANCOU=1 & [M]SOHNUM <> ""
       Effzo [M:SOH0]SOHNUM
    Endif
    If [M:SOH0]SOHCAT=2 & dim([M:SOH1]LNDRTNDAT) > 0
        If [M:SOH1]LNDRTNDAT = [0/0/0] & [M:SOH0]ORDDAT <> [0/0/0]
            [M:SOH1]LNDRTNDAT  = addmonth([M:SOH0]ORDDAT,1)
            Affzo [M:SOH1]LNDRTNDAT
        Endif
    Endif
    # 75115 : V7 : Extension of Digital Signature : New field delivery type
    [M:SOH2]SDHTYP=[F:TSO]SDHTYP
    Affzo [M:SOH2]SDHTYP
    
    # 107890 : Scheduled invoices : (LD:08/12/15)
    # Invoicing condition managed only for Normal order
    If [M:SOH0]SOHCAT<>1
      Raz [M:SOH3]INVCND
      Raz [M:SOH3]VCRINVCNDDAT
      Diszo [M:SOH3]INVCND
      Diszo [M:SOH3]VCRINVCNDDAT
    Else
      # Invoicing condition initialized from bill to customer
      If [M:SOH1]BPCINV<>""
          Local File BPCUSTOMER [BPC]
          If [F:BPC]BPCNUM <> [M:SOH1]BPCINV
              Read [F:BPC]BPC0 = [M:SOH1]BPCINV
              If fstat Raz [F:BPC] : Endif
              [M:SOH3]INVCND=[F:BPC]INVCND
          Endif
      Endif
      If [M:SOH3]VCRINVCNDDAT = [0/0/0] & [M:SOH0]ORDDAT <> [0/0/0]
          [M:SOH3]VCRINVCNDDAT  = [M:SOH0]ORDDAT
      Endif
      Actzo [M:SOH3]INVCND
      Actzo [M:SOH3]VCRINVCNDDAT
    Endif
    Affzo [M:SOH3]INVCND
    Affzo [M:SOH3]VCRINVCNDDAT
    # 107890 : Scheduled invoices : (LD:08/12/15)
    
    End
    # --------------------------------------- SALFCY ---------------------------------
    ########################################
    Subprog C_SALFCY(VALEUR)    : # ---  Web - Obligatoire - Synchrone
    Variable Char    VALEUR()
    Local    Char    WLEGCPY
    
    # Issue X3-135076 by ANKUL
    Read [FCY2]FCY0= VALEUR
    If !fstat
      [F:SOH]CPY=[F:FCY2]LEGCPY
      Gosub SOHNUMEND_SET_VISIBILITY From SUBSOHA
    Endif
    # Issue X3-135076 end
    
    Call SHOW_HIDE_PREPAYMENT_INVOICE_FIELDS(VALEUR) From SUBSOHA1 # Issue X3-243690 by MRDAB
    
    # Si le site de stockage est déjà renseigné revérifier la société juridique
    If [M:SOH2]STOFCY<>"" & [M:SOH2]STOFCY <> VALEUR
        If [F:FCY]FCY <> VALEUR
            Read [FCY]FCY0=VALEUR
        Endif
    #   Nouvelle société juridique
        WLEGCPY=[F:FCY]LEGCPY
        Read [FCY]FCY0=[M:SOH2]STOFCY
        If [F:FCY]LEGCPY <> WLEGCPY
            Raz [M:SOH2]STOFCY
            Affzo [M:SOH2]STOFCY
        Endif
    Endif
    End
    ########################################
    Subprog AM_SALFCY(VALEUR)    : # ---  Web - Obligatoire - Synchrone
    Variable Char    VALEUR()
    # Issue X3-134504 - 2019-04-15 by SR : Control of SOHTYP depending of the legistation of the new site
    Local Char    WSOHTYP(GLONTSO) : Local Integer  WSOHCAT : Local Char WSDHTYP(GLONTSD)
    If [M:SOH0]BPCORD <> ""
    #   Alimentation flag inter-site et inter-sociétéF
        Call ALIBETCPY(2,VALEUR,[M:SOH0]BPCORD,GBIDC1,[M:SOH0]POHFCY,[M:SOH0]BPSNUM,[M:SOH1]BETFCY,[M:SOH1]BETCPY) From TRTVENISOC
        If [M:SOH1]BETFCY=2
            # Bug 56725 : Interdire la saisie d'une commande inter-site de prêt
    #        # En V150, une commande de prêt ne peut pas être inter-site
    #        If [M:SOH0]SOHCAT=2 GMESSAGE=mess(291,192,1) : mkstat=2 : End : Endif
            Local Integer WLND    : WLND=[M:SOH0]SOHCAT
            Local Integer WBETFCY : WBETFCY=[M:SOH1]BETFCY
            Gosub CTR_LNDBETFCY From SUBSOHB : If mkstat=2 End Endif
            # Commande inter-site
            # Le client commande est aussi le fsseur (correspond au site de vente)
            If [M:SOH0]BPCORD=[M:SOH0]BPSNUM
                Local Integer WOK : WOK=1
                Call AVERTIR (mess(151,191,1), WOK)From GESECRAN
                If WOK=1 mkstat=2 : End : Endif
            Endif
            # Site achat et fournisseur sont renseignés --> Alim. du site d'origine pour déclencher l'automatisme
    #        If [M:SOH1]BETFCY=2 & [M:SOH0]BPSNUM<>"" & [M:SOH0]POHFCY<>""
    
            # Commande de vente inter-site sans flux automatique
            [M:SOH0]ORIFCY=[M:SOH0]SALFCY
    
    #        Endif
        Endif
        Affzo [M:SOH1]BETFCY
        Affzo [M:SOH1]BETCPY
    Endif
    # --> Refuser les commandes à facturation directe si commande intra-société
    If [M:SOH0]SOHCAT=3 & [M:SOH1]BETFCY=2 & [M:SOH1]BETCPY<=1 mkstat=2:GMESSAGE=mess(256,192,1): End: Endif
    
    [M:SOH2]ALLTYP=GALLTYP
    
    # Chargement des globales référenciels, comptes et sections de la société
    GFCY=VALEUR : Gosub CHARG_PARAM From SUBSOHA : If GERR=1 mkstat=2 : End Endif
    #-
    # Issue X3-134504 - 2019-04-11 by SR : if LEG is changed : Control and intialization of SOHTYP/SOHCAT/SDHTYP
    
    # 218177 : Behavior harmonization on sales document type / X3-241356 : harmonization in document type - sales order  - 2021-04-08 by LD
    #If [M:SOH0]SOHTYP <> ""
    #  If !clalev([F:TSO]) : Local File TABSOHTYP [TSO] : Endif
    #  #
    #  # is the existing SOHTYP value still OK with the new LEG ?
    #  Call CONTTSO([M:SOH0]SOHTYP,GCURLEG,"SOH0","SOHTYP",VALEUR,"",GSOCIETE) From SUBTSO
    #  # If SOHTYP not OK
    #  If mkstat
    #      Raz GMESSAGE
    #      Raz mkstat
    #      Raz [M:SOH0]SOHTYP
    #      Gosub SOHTYP From TRTVENCDE
    #      [M:SOH0]SOHTYP =  WSOHTYP
    #      [M:SOH0]SOHCAT =  WSOHCAT
    #      [M:SOH2]SDHTYP =  WSDHTYP
    #  # SOHTYP OK but may be the TSO record which will be used is not the same than previously, we have to reload SOHCAT/SDHTYP fields
    #  Else
    #      [M:SOH0]SOHCAT   = [F:TSO]SOHCAT
    #      [M:SOH2]SDHTYP   = [F:TSO]SDHTYP
    #  Endif
    #  Call AM_SOHTYP([M:SOH0]SOHTYP)
    #  If mkstat : End : Endif
    #Endif
    Raz WSOHTYP
    If [M:SOH0]SOHTYP <> ""
      If !clalev([F:TSO]) : Local File TABSOHTYP [TSO] : Endif
      #
      # is the existing SOHTYP value still OK with the new LEG ?
      Call CONTTSO([M:SOH0]SOHTYP,GCURLEG,"SOH0","SOHTYP",VALEUR,"",GSOCIETE) From SUBTSO
      # If SOHTYP not OK
      If mkstat
          Raz GMESSAGE
          Raz mkstat
          Raz [M:SOH0]SOHTYP
      Endif
    Endif
    If [M:SOH0]SOHTYP = ""
      # First the type is initialized from the general parameter associated to the category
      # And if it is not ok, we search for the first type available
      Case GORDCAT
        When 1, 4 : # 1-Normal or All category
          WSOHTYP = GSOHTYPNOR
        When 2    : # 2-Loan
          WSOHTYP = GSOHTYPLND
        When 3    : # 3-Direct invoicing
          WSOHTYP = GSOHTYPINV
      Endcase
      If WSOHTYP<>""
        Call CONTTSO(WSOHTYP,GCURLEG,"SOH0","SOHTYP",VALEUR,"",GSOCIETE) From SUBTSO
        If mkstat
            Raz GMESSAGE
            Raz mkstat
            Raz WSOHTYP
        Endif
      Endif
      If WSOHTYP = ""
        # Search for first type available
        Gosub SOHTYP From TRTVENCDE
      Endif
      [M:SOH0]SOHTYP =  WSOHTYP
    Endif
    # SOHTYP OK but may be the TSO record which will be used is not the same than previously, we have to reload SOHCAT/SDHTYP fields
    If [M:SOH0]SOHTYP <> ""
      [M:SOH0]SOHCAT   = [F:TSO]SOHCAT
      [M:SOH2]SDHTYP   = [F:TSO]SDHTYP
      Call AP_SOHTYP([M:SOH0]SOHTYP)
      If GERR=1 : End : Endif
      Call AM_SOHTYP([M:SOH0]SOHTYP)
    Endif
    # 218177 : Behavior harmonization on sales document type / X3-241356 : harmonization in document type - sales order  - 2021-04-08 by LD
    
    # End issue X3-134504
    #-
    #If GACTMUL=2
    # Alimentation concernant les colonnes frais/remises en fonction de la structure tarif de la société
    Local Char WSVG_PLISTC : WSVG_PLISTC=[M:SOH0]PLISTC
    Call ALICOLREM (1,2,GFLAG,"SOH4", [M:SOH1]CUR, 1,[M:SOH0]PLISTC) From TRTPRICE
    #Endif
    # Affichage entêtes colonnes variables (sections analytiques) en cas de changement de société
    If WSVG_PLISTC=GPLISTC
        # (A faire ssi la structure tarif n'a pas changé, sinon cela a déjà été fait dans ALICOLREM)
        Gosub AFF_TITCOL From SUBSOHA
    Else
      # Affzo nécessaire si sections invisibles pour faire disparaitre les colonnes
      If [M:SOH4]NBLIG=0
          [M:SOH4]NBLIG=1 : Affzo [SOH4]5 : Effzo [SOH4]5
      Endif
    Endif
    # Effacement tableau des sections entête si changement société
    If dim([M:SOH3]NBAXE)>0 & [M:SOH3]NBAXE>0
      [M:SOH0]SALFCY=VALEUR
      Effzo [SOH3]20 : Affzo [SOH3]20
    Endif
    If GSOC_UPDFLG
    #    Local Char     WSOHTYP(GLONTSO)
    #    Local Integer  WSOHCAT
    #    Gosub SOHTYP From TRTVENCDE
    #    [M:SOH0]SOHTYP=WSOHTYP
    #    [M:SOH0]SOHCAT=WSOHCAT
    Endif
    
    If GUPDCUR=1
        Diszo [M:SOH1]CUR
    Else
        Actzo [M:SOH1]CUR
    Endif
    
    If GNOTATI=1
        Diszo [M:SOH1]PRITYP
    Else
        Actzo [M:SOH1]PRITYP
    Endif
    
    If GLINREP=1
        If dim([M:SOH4]REP1) > 0 Diszo [M:SOH4]REP1, REPRAT1 Endif
        If dim([M:SOH4]REP2) > 0 Diszo [M:SOH4]REP2, REPRAT2 Endif
    Else
        If dim([M:SOH4]REP1) > 0 Actzo [M:SOH4]REP1, REPRAT1 Endif
        If dim([M:SOH4]REP2) > 0 Actzo [M:SOH4]REP2, REPRAT2 Endif
    Endif
    
    If GLINBPD=1
        Diszo [M:SOH4]DBPAADD
    Else
        Actzo [M:SOH4]DBPAADD
    Endif
    
    #If [M:SOH1]BETFCY=2 & [M:SOH0]ORIFCY<>""
    If [M:SOH1]BETFCY=2 & [M:SOH0]ORIFCY<>[M:SOH0]SALFCY
        Diszo [M:SOH0]CUSORDREF
    Else
        Actzo [M:SOH0]CUSORDREF
    Endif
    
    #------------------------------------------------------------#
    # Renseignement des unités de répartition                    #
    #------------------------------------------------------------#
    [M:SOH0]DSPWEU = GSALDSPWEU
    [M:SOH0]DSPVOU = GSALDSPVOU
    
    # JPGA : Traitement des exceptions Société : MAJ des informations au cas ou on changerait de Société
    If [M:SOH0]BPCORD <> ""
        If dim([M:SOH1]VACBPR) > 0
            #Gbn-79727-Ajouter alim à partir du client livré
            # JPGA : Initialisation du Régime taxe
            If [F:BPD]VACBPR<>""
                 If [F:BPD]VACBPR<>[M:SOH1]VACBPR
                     [M:SOH1]VACBPR = [F:BPD]VACBPR
                 Endif
            Else
                Call INIT_REGIME([M:SOH0]BPCORD, GSOCIETE, "C", [M:SOH1]VACBPR) From CPTSUB
            Endif
            Affzo [M:SOH1]VACBPR
        Endif
        If dim([M:SOH3]PTE) > 0
            # JPGA : Initialisation du code condition de paiement
            # Issue X3-154390 - 20191206 by LD
            # Updating the sites changes the payment term
            #Call INIPTE ([F:BPC]BPCPYR, [F:BPC]BPCINV, "C", [M:SOH3]PTE) From TRTX3
            Call INIPTE ([M:SOH1]BPCPYR, [M:SOH1]BPCINV, "C", [M:SOH3]PTE) From TRTX3
            # Issue X3-154390 - 20191206 by LD
            Affzo [M:SOH3]PTE
        Endif
        If dim([M:SOH3]DEP) > 0
            # JPGA : Initialisation des escomptes et agios
            Call INIT_ESCOMPTE([M:SOH0]BPCORD, GSOCIETE, "C", [M:SOH3]DEP) From CPTSUB
            Affzo [M:SOH3]DEP
        Endif
    Endif
    
    Gosub SHOW_HIDE_ENTCOD From TRTADRLIB   #109528.n
    
    # 101380.sn
    Call SETUP_SSTFIELDS From SUBSOHA
    
    # ACA - On recharge la liste des éléments de facturation, pour gérer le flag "remise sur taxe"
    Local Integer NBPOSTE : NBPOSTE=dim([M:SOH3]INVDTA)
    Call STRUFOOT (3,"SOH3",NBPOSTE,[F:SOH]CHGTYP,[F:BPC]CUR,[F:SOH]CUR,"NON") From SUBSFIT
    [M:SOH3]NBFAC = NBPOSTE
    Affzo [M:SOH3]25
    
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #--only if there are scheduling invoices filled on order's lines
    If [M:SOH4]NBLIG>0 and sigma(0,[M:SOH4]NBLIG-1,[M:SOH4]DINVCND(indcum)<>"")>1
      [M:SOH3]INVCNDTOUPD=[V]CST_AYES
    Endif
    # End issue 107888
    
    # Issue 120236 - Shippment site by default -> Stock site by default of the customer or user
    If [M:SOH2]STOFCY=""
       If [F:BPD]STOFCY="" or [M:SOH0]BPCORD=""
          Read [FCY]FCY0=GFCYDEF(7)
          If fstat: Raz [F:FCY]: Endif
       Else
          Read [FCY]FCY0=[F:BPD]STOFCY
       Endif
       If [F:FCY]LEGCPY = GSOCIETE:
          [M:SOH2]STOFCY=[F:FCY]FCY: Affzo [M:SOH2]STOFCY
       Endif
    Endif
    # End issue 120236
    
    End
    # --------------------------------------- CUSORDREF ------------------------------
    ##########################################################################
    ## Etiquette ajoutée par le superviseur 03/11/2003 17:57:49 (LD)
    ##########################################################################
    Subprog IB_CUSORDREF
    If [M]CUSORDREF="" | [M]BETFCY<>2 | [M]ORIFCY=[M]SALFCY Raz GBOUT1 Endif
    End
    ########################################
    Subprog AM_CUSORDREF(VALEUR)
    Variable Char    VALEUR()
    If VALEUR = "" | [M:SOH0]BPCORD = "" End : Endif
    Look [SOH] SOH1=[M:SOH0]BPCORD;VALEUR
    If !fstat
        Local Integer WOK : WOK=2
        Call AVERTIR (mess(80,191,1), WOK) From GESECRAN
        If WOK=1 mkstat=2 : End : Endif
    Endif
    End
    ########################################
    # 107890 : Scheduled invoices : (LD:14/01/16)
    # --------------------------------------- ORDDAT  ---------------------------------
    ########################################
    Subprog AM_ORDDAT(VALEUR)
    Variable Date    VALEUR
    
    Local Integer WOK # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    
    # Controls for Schedule invoices :
    # If the order date is increased and the scheduled invoice start date becomes lower :
    # The scheduled invoice start date is reinitialized only if no scheduled invoice are invoiced
    If [M:SOH0]SOHCAT=1
        # Order date is increased
        If VALEUR>[M:SOH0]ORDDAT
            If [M:SOH3]VCRINVCNDDAT<VALEUR
                # Scheduled invoice start date is lower
                If [M:SOH1]INVSTA=1
                    # No scheduled invoice are invoiced
                    # Scheduled invoice start date is reinitialized
                    [M:SOH3]VCRINVCNDDAT=VALEUR
                    Affzo [M:SOH3]VCRINVCNDDAT
                    # The system proposes to recalculate scheduled invoices for lines that are not partially invoiced a not linked to a progress status
                    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
                    #--only if there are scheduling invoices filled on order's lines
                    If [M:SOH4]NBLIG>0 and sigma(0,[M:SOH4]NBLIG-1,[M:SOH4]DINVCND(indcum)<> "")>1
                      WOK=2
                      Call OUINON(mess(498,192,1),WOK) From GESECRAN
                      If WOK=2
                        GERR=0
                        Gosub AM_ORDDAT_UPDATE_INVCNDDAT From LIBSAL_INVCND_SOH
                        If GERR=1 : mkstat=2 : End : Endif
                      Endif
                    Endif
                    # End issue 107888
                Elsif ([M:SOH4]NBLIG-1 >= 0 and sigma(0,[M:SOH4]NBLIG-1,[M:SOH4]DINVCND(indcum)) <> "")
                    # There are Scheduled invoice for the order
                    # Scheduled invoice are invoiced
                    # Order date can't be modified
                    # !! We'll need to change this when we can mix deliverable and undeliverable item
                    GMESSAGE=mess(496,192,1)-format$(GFMDAT4,[M:SOH3]VCRINVCNDDAT)
                    GERR=1 : mkstat=2 : End
                Endif
            Endif
        Endif
    Endif
    
    End
    # 107890 : Scheduled invoices : (LD:14/01/16)
    # --------------------------------------- BPCORD ---------------------------------
    ########################################
    Subprog C_BPCORD(VALEUR)    : # --- Web - Faible - Synchrone
    Variable Char    VALEUR()
    
    #Local Char WMESS9(250), WMESS1(250)    # FGR 10/03/2015 : X3SUIVI23273
    #Local Integer WCDTSTA                  # FGR 10/03/2015 : X3SUIVI23273
    #Local Decimal WOST, WOSTAUZ            # FGR 10/03/2015 : X3SUIVI23273
    #Local Integer WOK                      # FGR 10/03/2015 : X3SUIVI23273
    
      Call C_BPCORD(VALEUR) From TRTVENCDE
      If mkstat=2 End : Endif
      # Si prospect proposer la transformation du prospect en client
      If [F:BPC]BPCTYP=4 & GORITRFBPP = ""
        Local Integer OK : OK=2
        GMESSAGE=VALEUR-mess(259,196,1)
        Call AVERTIR (GMESSAGE, OK) From GESECRAN
        If OK=1
          mkstat = 2 : Raz GMESSAGE : End
        Endif
      Elsif [F:BPC]BPCTYP<>4
        Raz GORITRFBPP
      Endif
    #  # -------------------------------------
    #  # FGR 10/03/2015 : X3SUIVI23273 (début)
    #  #-- Contrôle état crédit pour le client --"
    #  Call SDCDTSTA('', VALEUR, [M:SOH0]CHGTYP, 0, [M:SOH1]CUR, [M:SOH0]ORDDAT, 0, 1, WCDTSTA, WOST, WOSTAUZ) From TRTVENCDT
    #  WMESS9 = '\' + '\' + format$("N:9.2",WOST) + '>' - format$("N:9.2",WOSTAUZ)
    #  Case WCDTSTA
    #    When 3
    #      # Dépassement d'en cours
    #      If !([M:SOH1]BETFCY = 2 & [M:SOH1]BETCPY <> 2) or GCTLBETFCY = 2 Then
    #        #- Si pas (Intersit & non intersoc) ou si Ctrl intersit encours&prix
    #        WOK = 2                        # FGR 21/03/2014 : X3SUIVI98224 pas WOK=1 pour ne pas bloquer en import
    #        WMESS1 = mess(29,192,1)
    #        #-- 81855
    #        If dim(GVENFLG02) >= 0 & (GVENFLG02 = 2 or GVENFLG02 = 3) Then
    #          WMESS1 += WMESS9
    #        Endif
    #        Call AVERTIR(WMESS1, WOK) From GESECRAN
    #        If WOK = 1 Then
    #          mkstat = 2
    #          End
    #        Endif
    #      Endif
    #    When Default
    #  Endcase
    #  # FGR 10/03/2015 : X3SUIVI23273 (fin)
    #  # -------------------------------------
      # Contrôle si le tiers risque est bloqué
      If (find(GREP, "C", "D") | [M]BPCORD <> VALEUR)
        Local Integer WOSTCTL
        If [F:BPC]BPCRSK<>VALEUR
          Local File BPCUSTOMER [BPC1] : # Lecture du tiers risque ss une autre abrev pour ne pas casser [F:BPC] du clt cde
          If [F:BPC1]BPCNUM <> [F:BPC]BPCRSK
            Read [F:BPC1]BPC0 = [F:BPC]BPCRSK
            If fstat Raz [F:BPC1] : Endif
          Endif
          WOSTCTL=[F:BPC1]OSTCTL
        Else
          WOSTCTL=[F:BPC]OSTCTL
        Endif
        If WOSTCTL = 3
          Local Integer WOK : WOK=2  # FGR 21/03/2014 : X3SUIVI98224 pas WOK=1 pour ne pas bloquer en import
          Call AVERTIR (mess(151,199,1), WOK) From GESECRAN
          If WOK=1 mkstat=2 : End : Endif
        Endif
      Endif
      # Controle existence référence client
      If [M:SOH0]CUSORDREF = "" End : Endif
      If !find (GREP, "C","D")  End : Endif
      Look [SOH] SOH1=VALEUR;[M:SOH0]CUSORDREF
      If !fstat
        Local Integer WOK : WOK=2
        Call AVERTIR (mess(80,191,1), WOK) From GESECRAN
        If WOK=1 mkstat=2 : End : Endif
      Endif
    End
    ########################################
    Subprog AP_BPCORD(VALEUR)    : # --- Web - Faible - Asynchrone
    Variable Char    VALEUR()
    # --> Alimentation de la raison sociale
    If [M:ADB1]BPRNAM(0) <> ""
        [M]BPCNAM = [M:ADB1]BPRNAM(0)
    Else
        [M]BPCNAM = [F:BPC]BPCNAM
    Endif
    Affzo [M:SOH0]BPCNAM
    End
    
    ########################################
    #---------------------------------------
    $AAP_BPCORD
    #----------------------------------------#
    # Action avant bouton tunnel client      #
    #----------------------------------------#
    Local Char    WOBJET(GLONAOB)
    If [F:BPC]BPCTYP = 4
        WOBJET="BPC" : If GORITRFBPP = "" GORITRFBPP="GESSOH" : Endif
    Endif
    Return
    #---------------------------------------
    $BAP_BPCORD
    
    #----------------------------------------#
    # Action apres bouton tunnel client      #
    #----------------------------------------#
    # Il faut vérifier que le client a bien été créé
    Read [F:BPC]BPC0 = VALEUR
    If fstat : mkstat=2 : Return : Endif
    If [F:BPC]BPCTYP=4 : mkstat=2 : Endif
    Return
    ########################################
    Subprog AM_BPCORD(VALEUR)    : # --- Web - Obligatoire - Synchrone
    Variable Char    VALEUR()
    
    Local Char WMESS9(250), WMESS1(250)    # FGR 10/03/2015 : X3SUIVI23273
    Local Integer WCDTSTA                  # FGR 10/03/2015 : X3SUIVI23273
    Local Decimal WOST, WOSTAUZ            # FGR 10/03/2015 : X3SUIVI23273
    Local Integer WOK                      # FGR 10/03/2015 : X3SUIVI23273
    
    Local Char WVALEUR(type([M:SOH0]BPCORD)-10) : WVALEUR = [M:SOH0]BPCORD
    # --> Si utilisation du bouton adresse, il ne faut pas passer en AM_
    #MAE If !GIMPORT & VALEUR = [M]BPCORD End : Endif #si création cmd par client, on passe en AM
    If !GIMPORT & VALEUR = [M]BPCORD & GCREFONC = 0 End : Endif
    
    # --- Changement de client en duplication de devis
    # --> Sauvegarde devise, régime, type de prix
    If GREP="D"
        Local    Char    WANCVACBPR
        Local    Integer WANCPRITYP
        Local    Char    WANCBPCORD : WANCBPCORD=[M:SOH0]BPCORD
        Local    Char    WANCLAN    : WANCLAN=[M:SOH0]LAN
        WANCVACBPR = [M:SOH1]VACBPR
        WANCPRITYP = [M:SOH1]PRITYP
        Call OUVRE_TRACE(mess(172,123,1)) From LECFIC
    Endif
    Local Char WANCCUR(GLONCUR) : WANCCUR    = [M:SOH1]CUR
    Call ALICDE(1,"C",VALEUR) From TRTVENCDE
    GFLTBPC = [F:SOH]BPCORD
    GBPCNUM = VALEUR
    
    # GRNA 20/05/2011
    Local Char CUSSEAORI : CUSSEAORI = "SOH1"
    Gosub AM_BPRNUM From CUSSEALIB
    
    # --> Initialisation de la date d'expédition et de la date de livraison demandée
    Local Char     WBPCORD, WBPAADD
    Local Integer  WDAYLTI
    WBPCORD=VALEUR : WBPAADD=[M:SOH1]BPAADD : WDAYLTI=[M:SOH2]DAYLTI
    Gosub INIT_DAT From SUBSOH1
    
    If [M:SOH0]SALFCY <> ""
    #   Alimentation flag inter-site et inter-société
        Call ALIBETCPY(2,[M:SOH0]SALFCY,VALEUR,GBIDC1,[M:SOH0]POHFCY,[M:SOH0]BPSNUM,[M:SOH1]BETFCY,[M:SOH1]BETCPY) From TRTVENISOC
        If [M:SOH1]BETFCY=2
            # Bug 56725 : Interdire la saisie d'une commande inter-site de prêt
    #        # En V150, une commande de prêt ne peut pas être inter-site
    #        If [M:SOH0]SOHCAT=2 [M:SOH0]BPCORD=WVALEUR : GMESSAGE=mess(291,192,1) : mkstat=2 : End : Endif
            Local Integer WLND    : WLND=[M:SOH0]SOHCAT
            Local Integer WBETFCY : WBETFCY=[M:SOH1]BETFCY
            mkstat=0 : #-- X3Suivi 76224
            Gosub CTR_LNDBETFCY From SUBSOHB : If mkstat=2 [M:SOH0]BPCORD=WVALEUR : End Endif
            # Commande inter-site
            # Le client commande est aussi le fsseur (correspond au site de vente)
            If [M:SOH0]BPCORD=[M:SOH0]BPSNUM
                Local Integer WOK : WOK=1
                #--CPO 79556 En import le message ne doit pas bloquant
                If GIMPORT=1 : WOK = 2 : Endif
                #--/CPO
                Call AVERTIR (mess(151,191,1), WOK)From GESECRAN
                If WOK=1 [M:SOH0]BPCORD=WVALEUR : mkstat=2 : End : Endif
            Endif
    #       Si commande inter-société, et site achat et fournisseur sont renseignés
    #       --> Alimentation du site d'origine pour déclencher l'automatisme
    #        If [M:SOH0]BPSNUM<>"" & [M:SOH0]POHFCY<>""
    
            # Commande de vente inter-site sans flux automatique
            [M:SOH0]ORIFCY=[M:SOH0]SALFCY
    
    #        Endif
        # 107605 : Raz site origine si la cde n'est plus intersite
        Else
            Raz [M:SOH0]ORIFCY
        # 107605
        Endif
    Endif
    
      # -------------------------------------
      # FGR 10/03/2015 : X3SUIVI23273 (début)
      #-- Contrôle état crédit pour le client --"
      Call SDCDTSTA('', VALEUR, [M:SOH0]CHGTYP, 0, [M:SOH1]CUR, [M:SOH0]ORDDAT, 0, 1, WCDTSTA, WOST, WOSTAUZ) From TRTVENCDT
      WMESS9 = '\' + '\' + format$("N:9.2",WOST) + '>' - format$("N:9.2",WOSTAUZ)
      Case WCDTSTA
        When 3
          # Dépassement d'en cours
          If !([M:SOH1]BETFCY = 2 & [M:SOH1]BETCPY <> 2) or GCTLBETFCY = 2 Then
            #- Si pas (Intersit & non intersoc) ou si Ctrl intersit encours&prix
            WOK = 2                        # FGR 21/03/2014 : X3SUIVI98224 pas WOK=1 pour ne pas bloquer en import
            WMESS1 = mess(29,192,1)
            #-- 81855
            If dim(GVENFLG02) >= 0 & (GVENFLG02 = 2 or GVENFLG02 = 3) Then
              WMESS1 += WMESS9
            Endif
            Call AVERTIR(WMESS1, WOK) From GESECRAN
            If WOK = 1 Then
              mkstat = 2
              End
            Endif
          Endif
        When Default
      Endcase
      # FGR 10/03/2015 : X3SUIVI23273 (fin)
      # -------------------------------------
    
    If WANCCUR<>[M:SOH1]CUR
        # Alimentation du format des colonnes frais/remise
        Call ALIFORREM (2, GFLAG, "SOH4", 0, [M:SOH1]CUR) From TRTPRICE
    Endif
    
    # --> Refuser les commandes à facturation directe si commande intra-société
    If [M:SOH0]SOHCAT=3 & [M:SOH1]BETFCY=2 & [M:SOH1]BETCPY<=1 [M:SOH0]BPCORD=WVALEUR : mkstat=2:GMESSAGE=mess(256,192,1): End: Endif
    
    If GREP="D"
        Raz [M:SOH1]PJT
        Raz [M:SOH4]DPJT  : # 71065 : PJT
    #   --> Recalcul des lignes
        Local Char    WZONCOU : WZONCOU="BPCORD"
        Local Char    FFLGMOD
        Local Integer OK
        Call OUINON (mess(21,191,1),OK) From GESECRAN
        If OK=2 GTARFLG="1" Endif
        Gosub RECALC_LIGNE From SUBSOHB
        Raz GTARFLG
        If mkstat = 2 [M:SOH0]BPCORD = WANCBPCORD : End Endif
        Raz GMESSAGE
        Call FERME_TRACE From LECFIC
        Call LEC_TRACE   From LECFIC
    Endif
    # --> Affichage des observations du client commande
    If !GIMPORT
       If len(vireblc([F:BPC]BPCREM,2)) & GERR=0 GMESSAGE = [F:BPC]BPCREM : GERR=2 : Endif
    Endif
    
    If GWEBSERV # ACA 70505
      Call CHARGE_ADRMSK("ADB1", VALEUR) From TRTVENDIV
      If dim([M:ADB2]BPAADD)>0 : [M:ADB2]BPAADD = [M:SOH1]BPAADD : Endif
      Call CHARGE_ADRMSK("ADB2", VALEUR) From TRTVENDIV
      Call CHARGE_ADRMSK("ADB3", [M:SOH1]BPCINV) From TRTVENDIV
    Endif
    
    # --> Réalimentation de la raison sociale en fonction de la saisie adresse
    If [M:ADB1]BPRNAM(0) <> ""
        [M]BPCNAM = [M:ADB1]BPRNAM(0)
    Else
        [M]BPCNAM = [F:BPC]BPCNAM
    Endif
    If [M]BPCINV = VALEUR [M:SOH1]BPINAM = [M]BPCNAM : Endif
    
    Affzo [M:SOH0]BPCNAM,CUR
    Affzo [M:SOH1]1-99
    Affzo [M:SOH2]1-99
    # 107890 : Scheduled invoices : (LD:08/12/15)
    #Affzo [M:SOH3]5,15,20,25
    Affzo [M:SOH3]5,10,15,20,25
    # 107890 : Scheduled invoices : (LD:08/12/15)
    
    If [M:SOH1]BETFCY = 2 & [M:SOH1]BETCPY<= 1
        Grizo [M:SOH1]BPCINV, BPCPYR
    Else
        Actzo [M:SOH1]BPCINV, BPCPYR
    Endif
    #If [M:SOH1]BETFCY=2 & [M:SOH0]ORIFCY<>""
    If [M:SOH1]BETFCY=2 & [M:SOH0]ORIFCY<>[M:SOH0]SALFCY
        Diszo [M:SOH0]CUSORDREF
    Else
        Actzo [M:SOH0]CUSORDREF
    Endif
    
    If [M:SOH2]DME = 3
    #    Diszo [M:SOH2]STOFCY
        Diszo [M:SOH4]DBPAADD, DSTOFCY, DDLVPIO, DDRN, DMDL, DBPTNUM
    Else
    #    Actzo [M:SOH2]STOFCY
        Actzo [M:SOH4]DBPAADD, DSTOFCY, DDLVPIO, DDRN, DMDL, DBPTNUM
    Endif
    
    #--CPO 82369 Duplication avec changement du client
    #Call NEW_SFIT ("M","SOH3",[M:SOH1]CUR,[M:SOH1]BPCINV,VALEUR,[M:SOH0]ORDDAT) From SUBSFIT
    If GREP="D"
      GREP="C"
      Local Char SFIT_OBJ : SFIT_OBJ="SOH"
      Gosub INIT_SFIT From SUBSFIT
      Call NEW_SFIT ("M","SOH3",[M:SOH1]CUR,[M:SOH1]BPCINV,VALEUR,[M:SOH0]ORDDAT) From SUBSFIT
      GREP="D"
    Else
      Call NEW_SFIT ("M","SOH3",[M:SOH1]CUR,[M:SOH1]BPCINV,VALEUR,[M:SOH0]ORDDAT) From SUBSFIT
    Endif
    #--/CPO
    
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #--only if there are scheduling invoices filled on order's lines
    If [M:SOH4]NBLIG>0 and sigma(0,[M:SOH4]NBLIG-1,[M:SOH4]DINVCND(indcum)<>"")>1
      [M:SOH3]INVCNDTOUPD=[V]CST_AYES
    Endif
    # End issue 107888
    
    End
    
    # --------------------------------------------------------------------------------
    #                                        Ecran SOH1
    # --------------------------------------------------------------------------------
    # --------------------------------------- BPCINV ---------------------------------
    Subprog C_BPCINV(VALEUR)    : # --- Web - Faible - Asynchrone
    Variable Char    VALEUR()
    #If (find(GREP, "C", "D") | [M]BPCINV <> VALEUR) & [F:BPC]OSTCTL = 3
    #    Local Integer WOK : WOK=1
    #    Call AVERTIR (mess(151,199,1), WOK) From GESECRAN
    #    If WOK=1 mkstat=2 : End : Endif
    #Endif
    # La modif du client facture est bloquée puisqu'on ne peut pas lé repercuter sur la cde d'achat
    # Commande inter-site avec commande d'achat réciproque
    #If [M:SOH1]BETFCY=2 & [M:SOH0]ORIFCY<>""
    #    Local Char LINVFCY
    #    Call RECINVFCY(VALEUR, LINVFCY) From TRTVENISOC
    #    If GERR=1 mkstat=2 : End : Endif
    #Endif
    End
    #######################################
    Subprog AP_BPCINV(VALEUR)
    Variable Char    VALEUR()
    
    # --> Si modif client raz adresse avant de passer dans le bouton adresse
    If !GIMPORT & VALEUR <> [M]BPCINV Raz [M:ADB3] : Endif
    
    # --> Si saisie de l'adresse alimentation de la raison sociale
    If [M:ADB3]BPRNAM(0) <> ""
        [M]BPINAM = [M:ADB3]BPRNAM(0)
    Else
        [M]BPINAM = [F:BPC]BPCNAM
    Endif
    Affzo [M:SOH1]BPINAM
    
    End
    ########################################
    Subprog AM_BPCINV(VALEUR)    : # --- Web - Obligatoire - Synchrone
    Variable Char    VALEUR()
    
    If GWEBSERV # ACA 70505
      Call CHARGE_ADRMSK("ADB3", VALEUR) From TRTVENDIV
    Endif
    
    # --> Si utilisation du bouton adresse, il ne faut pas passer en AM_
    If !GIMPORT & VALEUR = [M]BPCINV End : Endif
    
    If GREP = "C"
        Local Char WANCCUR(GLONCUR) : WANCCUR=[M:SOH1]CUR
    
        If GTARFLG = "" Then
          Call ALICDE(1, "F", VALEUR) From TRTVENCDE
          If WANCCUR<>[M:SOH1]CUR
              # ----------------------------------------------------
              # FGR 07/02/2014 : X3SUIVI95380 (début)
              # Alimentation du format des colonnes frais/remise
              Call ALIFORREM (2, GFLAG, "SOH4", 0, [M:SOH1]CUR) From TRTPRICE
              # Note : Fait dans AM_CUR
              Call CHANGE_CUR_BPCINV(WANCCUR)
              # FGR 07/02/2014 : X3SUIVI95380 (fin)
              # ----------------------------------------------------
              # If faut arrondir les frais/remises en fonction des nouveaux formats
              If [M:SOH4]NBLIG<>0
                  Call ARRCOLREM ([M:SOH1]CUR, "SOH4") From TRTPRICE
                  Affzo [M:SOH4]1-99
              Endif
          Endif
        Else
          # Alimentation du format des colonnes frais/remise
          Call ALIFORREM (2, GFLAG, "SOH4", 0, [M:SOH1]CUR) From TRTPRICE
        Endif
    #Else
    #   Modif. clt facture : recalcul de l'état crédit et rechargement des zones d'en-cours
    #    Call SDCDTSTA([M:SOH0]SOHNUM,VALEUR,[M:SOH0]CHGTYP,0,[M:SOH1]CUR,date$,[M:SOH2]UNL, 1, [M:SOH1]CDTSTA,[M]OST,[M]OSTAUZ) From TRTVENCDT
    Endif
    
    # Issue 112065
    # Reinit EECNUM when order modification
    If find(GREP,"","M") & dim([M:SOH0]BPIEECNUM)>0
        Call INIEECNUM ([M:SOH0]BPCORD,[M:SOH1]BPAADD,VALEUR,[M:SOH0]BPIEECNUM,[M:SOH0]EECNUMCRY) From TRTVENDIV
    Endif
    # End issue 112065
    
    # --> Affichage des observations du client facture
    If !GIMPORT & VALEUR <> [M:SOH0]BPCORD
       If len(vireblc([F:BPC]BPCREM,2)) & GERR=0 GMESSAGE = [F:BPC]BPCREM : GERR=2 : Endif
    Endif
    # --> Réalimentation de la raison sociale
    If [M:ADB3]BPRNAM(0) <> ""
        [M]BPINAM = [M:ADB3]BPRNAM(0)
    Else
        [M]BPINAM = [F:BPC]BPCNAM
    Endif
    
    Affzo [M:SOH1]BPINAM
    Affzo [M:SOH1]20
    # 107890 : Scheduled invoices : (LD:08/12/15)
    #Affzo [M:SOH3]5,15,20,25
    Affzo [M:SOH3]5,10,15,20,25
    # 107890 : Scheduled invoices : (LD:08/12/15)
    
    #--CPO 82369 Duplication avec changement du client
    #Call NEW_SFIT ("M","SOH3",[M:SOH1]CUR,VALEUR,[M:SOH0]BPCORD,[M:SOH0]ORDDAT) From SUBSFIT
    If GREP="D"
      GREP="C"
      Local Char SFIT_OBJ : SFIT_OBJ="SOH"
      Gosub INIT_SFIT From SUBSFIT
      Call NEW_SFIT ("M","SOH3",[M:SOH1]CUR,VALEUR,[M:SOH0]BPCORD,[M:SOH0]ORDDAT) From SUBSFIT
      GREP="D"
    Else
      Call NEW_SFIT ("M","SOH3",[M:SOH1]CUR,VALEUR,[M:SOH0]BPCORD,[M:SOH0]ORDDAT) From SUBSFIT
    Endif
    #--/CPO
    
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #--only if there are scheduling invoices filled on order's lines
    If [M:SOH4]NBLIG>0 and sigma(0,[M:SOH4]NBLIG-1,[M:SOH4]DINVCND(indcum)<>"")>1
      [M:SOH3]INVCNDTOUPD=[V]CST_AYES
    Endif
    # End issue 107888
    
    End
    
    ######################################################################################
    # FGR 07/02/2014 : X3SUIVI95380 (début) Pas possible d'utiliser AM_CUR à cause des
    #                                       valeur AVANT et APRES du champ. Obligé de refaire la même chose dans un autre S/P.
    Subprog CHANGE_CUR_BPCINV(SOLDCUR)
    Value Char SOLDCCUR
    
    Local    Integer SPSTAT, I
    Local    Decimal MONTANT, MONTORG (0..1), MONTDES (0..1)
    Local    Char    FFLGMOD(1)
    Local    Date    WOSTDAT
    Local    Libelle WOSTCHGTYP
    
    #  # --> Recalcul du montant mini cde
    #  Call CONVERT(SOLDCUR, [M:SOH0]CUR, GLOCALDEV, [M]CHGTYP, date$, [M:SOH0]ORDMINAMT,MONTANT,SPSTAT) From TRTDEV
    #  [M:SOH0]ORDMINAMT = MONTANT
    #  # --> Recalcul de l'en-cours et de l'en-cours autorise
    #  If [M:SOH0]OSTAUZ  <> 99999999999.99
    #      If GOSTCHGTYP=2
    #          # Si Origine cours pour contrôle en-cours = actualisé
    #          WOSTDAT=datesyst                                        : # Date          : date du jour
    #          WOSTCHGTYP= GOSTTYPCUR                                  : # Type de cours : Type de cours ctrl au cours actualisé
    #      Else
    #          # Si Origine cours pour contrôle en-cours = historique
    #          WOSTDAT=[M]ORDDAT                                       : # Date          : date du document
    #          WOSTCHGTYP=[M]CHGTYP                                    : # Type de cours : Type de cours du document
    #      Endif
    #      MONTORG(0)      =  [M:SOH0]OST
    #      MONTORG(1)      =  [M:SOH0]OSTAUZ
    #      Call CONVERT(SOLDCUR,[M:SOH0]CUR,GLOCALDEV,WOSTCHGTYP,WOSTDAT,MONTORG(0),MONTDES(0),SPSTAT) From TRTDEV
    #      Call CONVERT(SOLDCUR,[M:SOH0]CUR,GLOCALDEV,WOSTCHGTYP,WOSTDAT,MONTORG(1),MONTDES(1),SPSTAT) From TRTDEV
    #      [M:SOH0]OST     = MONTDES(0)
    #      [M:SOH0]OSTAUZ  = MONTDES(1)
    #  Endif
    #  # --> Recalcul des montants de facturation
    #  If [M:SOH3]NBFAC <> 0
    #     For I = 0 To [M:SOH3]NBFAC-1
    #        If [M:SOH3]AMTCOD(I) = 2
    #            [M:SOH3]FORMAT(I) = "NZ:"+[F:TCU]CURFMT1
    #           Call CONVERT(SOLDCUR, [M:SOH0]CUR, GLOCALDEV, [M]CHGTYP, date$, [M:SOH3]INVDTAAMT(I),MONTANT,SPSTAT) From TRTDEV
    #           [M:SOH3]INVDTAAMT(I) = MONTANT
    #        Endif
    #     Next I
    #  Endif
    
      Affzo [M:SOH3]1-99
      Affzo [M:SOH0]CUR
      Affzo [M:SOH4]5
    
      # On a pas fait de recherche tarif : on fera une conversion
      If [M:SOH4]NBLIG <> 0 & GTARFLG = ""
          Local Char    WZONCOU    : WZONCOU = "CUR"
          Local Char    WANCCUR    : WANCCUR=SOLDCUR
          Local Char    WANCVACBPR : WANCVACBPR=[M:SOH1]VACBPR
          Local Integer WANCPRITYP : WANCPRITYP=[M:SOH1]PRITYP
          Gosub RECALC_LIGNE From SUBSOHB
      Endif
      Raz GTARFLG
    End
    # FGR 07/02/2014 : X3SUIVI95380 (fin)
    
    # --------------------------------------- BPCPYR ---------------------------------
    ######################################################################################
    ## Etiquette ajoutée par le superviseur (écran SOH1) 27/09/2004 15:36:06 (LD)
    ######################################################################################
    Subprog AM_BPCPYR(VALEUR)
    Variable Char    VALEUR()
    If GREP = "C"
        Call INIPTE (VALEUR, [M:SOH1]BPCINV, "C", [M:SOH3]PTE) From TRTX3
        Affzo [M:SOH3]PTE
    Endif
    End
    ######################################################################################
    # --------------------------------------- BPAADD ---------------------------------
    Subprog C_BPAADD(VALEUR)     : # --- Web - Faible - Asynchrone
    Variable Char    VALEUR()
    Local    Char    WSTOFCY
    
    # Commande inter-site et un site de réception est lié à l'adresse de livraison
    # Il faut vérifier que les couples articles-site de réception existent
    If [M:SOH1]BETFCY=2 & [M:SOH0]SOHCAT=3 & [F:BPD]RCPFCY<>"" & [M:SOH4]NBLIG>0
       Local Char    WFCY : WFCY=[F:BPD]RCPFCY
       Local Integer OK
       Gosub VERIF_LIGNE_ITF From TRTVENCDE
       If OK=0 GMESSAGE = mess(74,187,1)-":"-GMESSAGE-mess(293,192,1)-WFCY : mkstat=2 : End Endif
    Endif
    
    # Contrôle de l'emplacement client si cde de prêt
    # En modif de cde, on ne peut controler qu'en AM_
    # --> le site est rechargé ou pas si on desire ou pas realimenter les zones
    If GREP <> "C" & GREP <> "D" End Endif
    If [F:BPD]STOFCY <> ""
        WSTOFCY = [F:BPD]STOFCY
    Else
        WSTOFCY = GFCYDEF(7)
    Endif
    Gosub CTR_LOC From SUBSOHB
    
    # BPAADD rendu non modifiable pour l'instant
    # Commande inter-site avec commande d'achat réciproque
    #If [M:SOH1]BETFCY=2 & [M:SOH0]ORIFCY<>""
    #    Local Char LPRHFCY
    #    Call RECPRHFCY([M:SOH0]BPCORD, VALEUR, LPRHFCY) From TRTVENISOC
    #    If GERR=1 mkstat=2 : End : Endif
    #Endif
    End
    ########################################
    Subprog AP_BPAADD(VALEUR)
    Variable Char    VALEUR()
    # --> Si modif client raz adresse avant de passer dans le bouton adresse
    If !GIMPORT & VALEUR <> [M]BPAADD Raz [M:ADB2] : Endif
    
    # --> Alimentation de la raison sociale
    If [M:ADB2]BPRNAM(0) <> ""
        [M]BPDNAM = [M:ADB2]BPRNAM(0)
    Else
        [M]BPDNAM = [F:BPD]BPDNAM(0)
    Endif
    Affzo [M]BPDNAM
    End
    ########################################
    Subprog AM_BPAADD(VALEUR)
    Variable Char    VALEUR()
    Local    Integer OK, OK1, W_ALICDE : W_ALICDE=1
    Local    Date    WDEMDLVDAT
    
    If GWEBSERV # ACA 70505
      # FGR 23/06/2014 : X3SUIVI100043 (début)
      #If dim([M:ADB2]BPAADD)>0 : [M:ADB2]BPAADD = [M:SOH1]BPAADD : Endif
      #Call CHARGE_ADRMSK("ADB2", VALEUR) From TRTVENDIV
      If dim([M:ADB2]BPAADD)>0 : [M:ADB2]BPAADD = VALEUR : Endif
      Call CHARGE_ADRMSK("ADB2", [M:SOH0]BPCORD) From TRTVENDIV
      # FGR 23/06/2014 : X3SUIVI100043 (fin)
    Endif
    
    # --> Si utilisation du bouton adresse, il ne faut pas passer en AM_
    If !GIMPORT & VALEUR = [M]BPAADD End : Endif
    
    OK=2 : OK1=2
    If !find(GREP,"C","D") Call OUINON(mess(129,191,1),OK) From GESECRAN Endif
    
    If OK=2
         W_ALICDE=2
         If [M:SOH4]NBLIG<>0
             # On affiche plus les msgs d'avertissement si infos douanières ou régime de taxes différents sur les lignes
             #Gosub CTR_COHERENCE_LIGNE
             If mkstat=2
                # Restauration de la raison sociale
                If [M]BPDNAM = [F:BPD]BPDNAM(0)
                    If [M:ADB2]BPRNAM(0) <> ""
                       [M]BPDNAM = [M:ADB2]BPRNAM(0)
                    Else
                        If [F:BPD]BPCNUM<>[M:SOH0]BPCORD | [F:BPD]BPAADD<>[M:SOH1]BPAADD
                            Read [F:BPD]BPD0 = [M:SOH0]BPCORD;[M:SOH1]BPAADD : If fstat Raz [BPD] Endif
                        Endif
                        [M]BPDNAM = [F:BPD]BPDNAM(0)
                    Endif
                    Affzo [M]BPDNAM : mkstat=2 : # (cassé par l'affzo)
                Endif
                End
             Endif
         Endif
         Raz GMESSAGE : OK=1
         # --> Créat./duplicat. et aucune ligne encore saisie : on demande si réinit. de la date liv ddée
         #     Si le délai de livraison est modifié, ou si les jours ou les périodes d'indispo sont différentes
         #     Reinit date liv. ddée ou recalcul date expédition
         If [M:SOH2]DEMDLVDAT<>[0/0/0] & find(GREP,"C","D") & [M:SOH4]NBLIG=0                         : # Bug 65068
             If clalev([F:BPD1]) = 0 Local File BPDLVCUST [BPD1] : Endif                              : # Bug 65068
             If [F:BPD1]BPCNUM<>[M:SOH0]BPCORD | [F:BPD1]BPAADD<>[M:SOH1]BPAADD                       : # Bug 65068
                 Read [F:BPD1]BPD0 = [M:SOH0]BPCORD;[M:SOH1]BPAADD                                    : # Bug 65068
                 If fstat Raz [F:BPD1] Endif                                                          : # Bug 65068
             Endif                                                                                    : # Bug 65068
             Local Integer WUVYDAY (0..6), WUVYDAY1 (0..6), I                                         : # Bug 65068
             Local Integer WUVYDAYDIFF : [L]WUVYDAYDIFF = 0                                           : #--CPO 80905
             For I=0 To 6                                                                             : # Bug 65068
                 WUVYDAY(I)  = evalue ("[F:BPD]UVYDAY"+num$(I+1))                                     : # Bug 65068
                 WUVYDAY1(I) = evalue ("[F:BPD1]UVYDAY"+num$(I+1))                                    : # Bug 65068
                 If WUVYDAY1(I)<>WUVYDAY(I) : [L]WUVYDAYDIFF = 1 : Endif                              : #--CPO 80905
             Next                                                                                     : # Bug 65068
             #If [M:SOH2]DAYLTI<>[F:BPD]DAYLTI | [F:BPD1]UVYCOD<>[F:BPD]UVYCOD | WUVYDAY1<>WUVYDAY    : # Bug 65068
             If [M:SOH2]DAYLTI<>[F:BPD]DAYLTI | [F:BPD1]UVYCOD<>[F:BPD]UVYCOD | [L]WUVYDAYDIFF = 1    : #--CPO 80905
                #--CPO 80905 Dde de CH
                #Call OUINON(mess(496,197,1)-":"-format$(GFMD,[M:SOH2]DEMDLVDAT)-"\"-mess(162,191,1)-":"-mess(161,191,1), OK) From GESECRAN
                Call OUINON(mess(794,197,1), OK) From GESECRAN
                If OK=2
                    # Si réinit. date liv ddée : il faut réinitialiser la date d'expé puis calculer la date liv ddée
                    Local Char     WBPCORD, WBPAADD
                    Local Integer  WDAYLTI
                    WBPCORD=[M:SOH0]BPCORD : WBPAADD=VALEUR : WDAYLTI=[F:BPD]DAYLTI
                    Gosub INIT_DAT From SUBSOH1
                Endif
             Endif
         Endif
         If OK=1
            # --> Pas de réinit date liv. ddée
            #     Vérification date liv. ddée pour la nouvelle adresse de livraison
            WDEMDLVDAT=[M:SOH2]DEMDLVDAT
            Call CTLUVYBPD(WDEMDLVDAT, VALEUR, [M:SOH0]BPCORD, 0) From TRTVENCTL
            If mkstat=2 Call AVERTIR(mess(496,197,1)-":"-format$(GFMDAT,WDEMDLVDAT)-"\"-GMESSAGE, OK1) From GESECRAN Endif :#--CPO 83985 GFMDAT au lieu de GFMD
            Raz GMESSAGE : If OK1=1 : End : Endif
            mkstat=0
            # ------------------------------------------------------
            # FGR 20/08/2014 : X3SUIVI95377 (début) : on vérifie que la date d'expédition est cohérente avec la livraison
            Local Integer IFORCECALCUL
    
            IFORCECALCUL = 0
            If WDEMDLVDAT <> [0/0/0] and [M:SOH2]DAYLTI = [F:BPD]DAYLTI Then
              Local Date WSHIDAT
    
              Call CALC_SHIDAT(WDEMDLVDAT, [F:BPD]DAYLTI, [F:BPD]STOFCY, 1, 1, [M:SOH0]ORDDAT, WSHIDAT) From TRTVENDAT
              If WSHIDAT <> [M:SOH2]SHIDAT Then
                IFORCECALCUL = 1
              Endif
            Endif
            # FGR 20/08/2014 : X3SUIVI95377 (fin)
            # ------------------------------------------------------
            # Date liv ddée ok pour la nouvelle adresse de livraison
            # Recalcul date expedition si le délai est modifié
            #If WDEMDLVDAT <> [0/0/0] & ([M:SOH2]DAYLTI<>[F:BPD]DAYLTI | WDEMDLVDAT<>[M:SOH2]DEMDLVDAT) # FGR 20/08/2014 : X3SUIVI95377
            If (WDEMDLVDAT <> [0/0/0] & ([M:SOH2]DAYLTI<>[F:BPD]DAYLTI | WDEMDLVDAT<>[M:SOH2]DEMDLVDAT)) or IFORCECALCUL = 1 Then
              #Call MESSAGE(mess(162,191,1)-":"-mess(163,191,1)) From GESECRAN : Raz GMESSAGE
              If IFORCECALCUL = 1 Then
                Call MESSAGE(mess(260,191,1)-":"-mess(163,191,1)) From GESECRAN
              Else
                Call MESSAGE(mess(162,191,1)-":"-mess(163,191,1)) From GESECRAN
              Endif
              Raz GMESSAGE
              Call CALC_SHIDAT(WDEMDLVDAT, [F:BPD]DAYLTI, [F:BPD]STOFCY, 1, 1, [M:SOH0]ORDDAT, [M:SOH2]SHIDAT) From TRTVENDAT
            Endif
            [M:SOH2]DEMDLVDAT=WDEMDLVDAT
         Endif
         Call ALICDE(1,"L",VALEUR) From TRTVENCDE
         Affzo [M:SOH1]BPDNAM
         Affzo [M:SOH1]15,20
         Affzo [M:SOH2]5,15
         Affzo [M:SOH2]DAYLTI,SHIDAT
         Affzo [M:SOH2]DEMDLVDAT
    Else
    # Réalimentation du code adresse (client livré) dans [M:ADB2] pour saisie adresse libre
        If dim([M:ADB2]BPAADD) > 0
           [M:ADB2]BPAADD    = [F:BPD]BPAADD
           Call RECH_CNTNAM([M:SOH0]BPCORD, [F:BPD]BPAADD, [M:ADB2]CNTNAM) From TRTVENDIV
        Endif
    Endif
    
    # En modif, contrôle de l'emplacement client
    If !find(GREP,"C","D")
        Local    Char    WSTOFCY : WSTOFCY = [M:SOH2]STOFCY
        Gosub CTR_LOC From SUBSOHB : If mkstat=2 End : Endif
    Endif
    # --> Réalimentation de la raison sociale
    If [M:ADB2]BPRNAM(0) <> ""
        [M]BPDNAM = [M:ADB2]BPRNAM(0)
    Else
        [M]BPDNAM = [F:BPD]BPDNAM(0)
    Endif
    GBIDI1=W_ALICDE
    
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #--only if there are scheduling invoices filled on order's lines
    If [M:SOH4]NBLIG>0 and sigma(0,[M:SOH4]NBLIG-1,[M:SOH4]DINVCND(indcum)<> "")>1
      [M:SOH3]INVCNDTOUPD=[V]CST_AYES
    Endif
    # End issue 107888
    
    End
    ## -------------------------------------------------------------------------------
    ## Contrôle de cohérence entre le client livré entête et les clients livrés lignes
    ## -------------------------------------------------------------------------------
    #$CTR_COHERENCE_LIGNE
    #
    ## Si adresses de livraison à la ligne différentes de celle de l'entête
    ## Vérif.cohérence entre l'adresse entête et adresses à la ligne concernant les infos douanières et le régime de taxe
    #Local Char WVACBPR(GLONADI), WDETVACBPR(GLONADI), WENTVACBPR(GLONADI)
    #Local Integer WI, WJ, WOK
    #WJ=sigma(WI=0,[M]NBLIG-1,[M:SOH4]DBPAADD(WI)<>VALEUR)
    #If WJ<>0
    #    If clalev([F:BPD1]) = 0 Local File BPDLVCUST [BPD1] : Endif
    #    For WI=0 To [M]NBLIG-1
    #        If [M]DBPAADD(WI)<>VALEUR
    #            If [F:BPD1]BPCNUM<>[M:SOH0]BPCORD | [F:BPD1]BPAADD<>[M:SOH4]DBPAADD(WI)
    #                Read [F:BPD1]BPD0 = [M:SOH0]BPCORD;[M:SOH4]DBPAADD(WI)
    #                If fstat Raz [F:BPD1] Endif
    #            Endif
    #            If [F:BPD]VACBPR="" | [F:BPD1]VACBPR=""
    #                Call INIT_REGIME([M:SOH0]BPCORD, GSOCIETE, "C", WVACBPR) From CPTSUB
    #            Endif
    #            If [F:BPD1]VACBPR<>"" WDETVACBPR=[F:BPD1]VACBPR Else WDETVACBPR=WVACBPR Endif
    #            If [F:BPD]VACBPR <>"" WENTVACBPR=[F:BPD]VACBPR  Else WENTVACBPR=WVACBPR Endif
    #            WOK=2
    #            If (WDETVACBPR<>WENTVACBPR)
    #                WOK=1 : # Régime de taxe client livré XXX différent du régime de taxe client livré ligne YYY
    #                GMESSAGE=mess(620,197,1)-mess(42,191,1)-"("+WENTVACBPR+")"-mess(621,197,1)-mess(620,197,1)-mess(42,191,1)-mess(18,197,1)-[M:SOH4]DBPAADD(WI)-"("+WDETVACBPR+")"
    #            Elsif ([F:BPD]EECNUM<>[F:BPD1]EECNUM & [F:BPD1]EECNUM<>"")
    #                WOK=1 : # N°Identification CEE client livré XXX différent du N°identification CEE client livré ligne YYY
    #                GMESSAGE=mess(629,197,1)-mess(42,191,1)-"("+[F:BPD]EECNUM+")"-mess(621,197,1)-mess(629,197,1)-mess(42,191,1)-mess(18,197,1)-[M:SOH4]DBPAADD(WI)-"("+[F:BPD1]EECNUM+")"
    #            Elsif ([F:BPD]EECICT<>[F:BPD1]EECICT & [F:BPD1]EECICT<>"")
    #                WOK=1 : # Code incoterm client livré XXX différent du code incoterm client livré ligne YYY
    #                GMESSAGE=mess(630,197,1)-mess(42,191,1)-"("+[F:BPD]EECICT+")"-mess(621,197,1)-mess(630,197,1)-mess(42,191,1)-mess(18,197,1)-[M:SOH4]DBPAADD(WI)-"("+[F:BPD1]EECICT+")"
    #            Elsif dim([M:SQH0]EECLOC)>0 & ([F:BPD]EECLOC<>[F:BPD1]EECLOC & [F:BPD1]EECLOC<>0)
    #                WOK=1 : # Lieu transport CEE client livré XXX différent du Lieu transport CEE client livré ligne YYY
    #
    # GMESSAGE=mess(631,197,1)-mess(42,191,1)-"("+mess([F:BPD]EECLOC,236,1)+")"-mess(621,197,1)-mess(631,197,1)-mess(42,191,1)-mess(18,197,1)-[M:SOH4]DBPAADD(WI)-"("+mess([F:BPD1]EECLOC,236,
    #& 1)+")"
    #            Endif
    #            # Si incohérence, on prévient l'utilisateur, s'il décide de continuer on force la répercution sur les lignes
    #            If WOK=1
    #                Call AVERTIR (GMESSAGE, WOK) From GESECRAN
    #                If WOK=2 W_ALICDE=21 Else mkstat=2 : Raz GMESSAGE : Break : Endif
    #            Endif
    #        Endif
    #    Next
    #Endif
    #If mkstat=2 Return Endif
    ## Il y a des incohérences entre le clt livré entête et les clts livrés lignes
    ## --> Répercution automatique obligatoire sur les lignes détails
    #If W_ALICDE=21 Call MESSAGE (mess(204,191,1)-":\"-mess(205,191,1)) From GESECRAN Endif
    #
    #Return
    # --------------------------------------- PJT ---------------------------------
    ########################################
    # Issue X3-63242 - 2017-11-24 by FGR : BEGIN backporting missing
    #Subprog IB_PJT
    #
    #If GMODU(13) = 2
    #    GBOUT1 = mess(8, 31, 1) #Sélection
    #    GBOUT2 = mess(1, 967, 1) #Affaires
    #    Call TEXTE(23406, GBOUT3) From OBJDIV      #Affaires client
    #
    #    If [M:SOH1]PJT = ""
    #        Call TEXTE(23422, GBOUT4) From OBJDIV      #Origine marketing
    #        # FGR 29/01/2010 : X3SUIVI60111 (début)
    #        If [M:SOH1]OPGNUM <> "" Then
    #          Case [M:SOH1]OPGTYP
    #            When "OMM"
    #              GBOUT5 = mess(2,2994,1) - ":" - [M:SOH1]OPGNUM
    #            When "OMP"
    #              GBOUT5 = mess(3,2994,1) - ":" - [M:SOH1]OPGNUM
    #            When "OMT"
    #              GBOUT5 = mess(4,2994,1) - ":" - [M:SOH1]OPGNUM
    #            When "OMN"
    #              GBOUT5 = mess(5,2994,1) - ":" - [M:SOH1]OPGNUM
    #            When Default
    #              Raz GBOUT5
    #          Endcase
    #        Else
    #          Raz GBOUT5
    #        Endif
    #        # FGR 29/01/2010 : X3SUIVI60111 (fin)
    #    Else
    #        Raz GBOUT4
    #        Raz GBOUT5     # FGR 29/01/2010 : X3SUIVI60111
    #    Endif
    #Else
    #    Raz GBOUT1
    #    Raz GBOUT2
    #    Raz GBOUT3
    #    Raz GBOUT4
    #    Raz GBOUT5     # FGR 29/01/2010 : X3SUIVI60111
    #Endif
    #
    #End
    
    Subprog IB_PJT
      If GMODU(13) = 2 Then
        If [M:SOH1]PJT = "" Then
          Call TEXTE(23422, GBOUT5) From OBJDIV # Origine marketing
          If [M:SOH1]OPGNUM <> "" Then
            Case [M:SOH1]OPGTYP
              When "OMM"
                GBOUT6 = mess(2,2994,1) - ":" - [M:SOH1]OPGNUM
              When "OMP"
                GBOUT6 = mess(3,2994,1) - ":" - [M:SOH1]OPGNUM
              When "OMT"
                GBOUT6 = mess(4,2994,1) - ":" - [M:SOH1]OPGNUM
              When "OMN"
                GBOUT6 = mess(5,2994,1) - ":" - [M:SOH1]OPGNUM
              When Default
                Raz GBOUT6
            Endcase
          Else
            Raz GBOUT6
          Endif
        Else
            Raz GBOUT5
            Raz GBOUT6
        Endif
      Else
        Raz GBOUT5
        Raz GBOUT6
      Endif
      # Issue X3-200515/X3-227027 - 2020-12-22 by SR : General tour : Raz Jum to button if ther is at least one progress billing or one Milestone linked.
      If [M:SOH4]NBLIG > 0
        Gosub INIT_JUMP_TO_PJT From LIBSAL_INVCND_SOH
      Endif
      # End issue X3-200515/X3-227027
    
    End
    # Issue X3-63242 - 2017-11-24 by FGR : END
    
    ##########################################################################
    Subprog AM_PJT(VALEUR)
    Variable Char    VALEUR()
    
    [M:SOH1]CMGNUM = ""
    [M:SOH1]OPGNUM = ""
    [M:SOH1]OPGTYP = ""
    
    # Issue X3-81031
    # En modification du code affaire entête :
    # On doit conserver l'initialisation des axes si pas de lignes : Réhabilitation de la modification 71065
    # Et réinitialiser systématiquement l’axe affaire (entête et lignes) : C'est ce qui est géré par le type de données PJT
    # Header project code modification :
    # We neeed to do the analytical dimension intialization if there is no lines
    # And we need to initialize the dimension managed by project (header and lines) : That's managed by the data type PJT
    
    ## X3-3808  : Update project dimension on sales documents / X3-49222 (LD 08/10/17)
    ## Ceci est désormais géré par le type de données PJT/This is now managed by activity code PJM
    # 71065 : PJT
    # Réinitialisation des sections analytiques
    # ssi aucune ligne saisie (car il n'y a pas de réinitialisation des sections sur les lignes)
    If [M:SOH4]NBLIG=0
        If dim([M]NBAXE)>0
          Local Integer WOK : WOK=2
          Call OUINON(mess(236,187,1)-mess(622,197,1)-"?",WOK) From GESECRAN
          If WOK=2
              If [M]NBAXE>0
                  For I=1 To [M]NBAXE Raz [M]CCE(I-1) : Next
              Endif
              [M:SOH1]PJT=VALEUR
              Call INIT_CCEH("SOH3","NBAXE","SOH") From TRTX3CPT
              Affzo [M:SOH3]20
          Endif
        Endif
    Endif
    # 71065 : PJT
    ## X3-3808  : Update project dimension on sales documents / X3-49222 (LD 08/10/17)
    
    # End issue X3-81031
    End
    # --------------------------------------- VACBPR ---------------------------------
    ######################################################################################
    ## Etiquette ajoutée par le superviseur (écran SOH1) 30/09/2005 09:09:04 (LD)
    ######################################################################################
    Subprog C_VACBPR(VALEUR)
    Variable Char    VALEUR()
    
    If VALEUR<>[M]VACBPR
        Local Integer OK : OK=2
        # 107888 : Scheduled invoices : (LD:10/05/16)
        # --> Dde de confirmation s'il y a des livraisons
    #    If [M]SOHCAT <> 3 & sum([M]ODLQTY,[M]DLVQTY) <> 0
    #        Call AVERTIR(mess(120,191,1)-":"-mess(205,100,1),OK) From GESECRAN
    #        If OK=1 mkstat=2 : End : Endif
    #    Endif
        # --> Commande normale
        #     Dde de confirmation s'il y a des livraisons (pour les articles livrables) ou des factures (pour les articles non livrables)
        If [M]SOHCAT = 1
            If sum([M]ODLQTY,[M]DLVQTY,[M]INVQTY) <> 0
                Call AVERTIR(mess(275,191,1)-":"-mess(205,100,1),OK) From GESECRAN
                If OK=1 mkstat=2 : End : Endif
            Endif
        Endif
        # --> Commande de prêt
        #     Dde de confirmation s'il y a des livraisons
        If [M]SOHCAT = 2
            If sum([M]ODLQTY,[M]DLVQTY) <> 0
                Call AVERTIR(mess(120,191,1)-":"-mess(205,100,1),OK) From GESECRAN
                If OK=1 mkstat=2 : End : Endif
            Endif
        Endif
        # 107888 : Scheduled invoices : (LD:10/05/16)
        # --> Commande à facturation directe
        #     Dde de confirmation s'il y a des factures
        If [M]SOHCAT = 3 & sum([M]ODLQTY, [M]INVQTY) <> 0
            Call AVERTIR(mess(58,117,1)-":"-mess(205,100,1),OK) From GESECRAN
            If OK=1 mkstat=2 : End : Endif
        Endif
    Endif
    End
    ########################################
    Subprog AM_VACBPR(VALEUR)
    Variable Char    VALEUR()
    
    If [M:SOH4]NBLIG <> 0
    #    GTARFLG = "V"
        Local Char    WZONCOU    : WZONCOU = "VACBPR"
        Local Char    FFLGMOD(1)
        Local Char    WANCCUR    : WANCCUR=[M]CUR
        Local Char    WANCVACBPR : WANCVACBPR=[M]VACBPR
        Local Integer WANCPRITYP : WANCPRITYP=[M]PRITYP
        [M:SOH1]VACBPR=VALEUR
        Gosub RECALC_LIGNE From SUBSOHB
        If mkstat [M:SOH1]VACBPR=WANCVACBPR : End : Endif : # Bug 75162
        Raz GTARFLG
    Endif
    End
    # --------------------------------------- CUR ---------------------------------
    ########################################
    Subprog AM_CUR(VALEUR)
    Variable Char    VALEUR()
    
    Local    Integer SPSTAT, I
    Local    Decimal MONTANT, MONTORG (0..1), MONTDES (0..1)
    Local    Char    FFLGMOD(1)
    Local    Date    WOSTDAT
    Local    Libelle WOSTCHGTYP
    
    # --> Recalcul du montant mini cde
    Call CONVERT([M:SOH0]CUR, VALEUR, GLOCALDEV, [M]CHGTYP, date$, [M:SOH0]ORDMINAMT,MONTANT,SPSTAT) From TRTDEV
    [M:SOH0]ORDMINAMT = MONTANT
    # --> Recalcul de l'en-cours et de l'en-cours autorise
    If [M:SOH0]OSTAUZ  <> 99999999999.99
        If GOSTCHGTYP=2
            # Si Origine cours pour contrôle en-cours = actualisé
            WOSTDAT=datesyst                                        : # Date          : date du jour
            WOSTCHGTYP= GOSTTYPCUR                                  : # Type de cours : Type de cours ctrl au cours actualisé
        Else
            # Si Origine cours pour contrôle en-cours = historique
            WOSTDAT=[M]ORDDAT                                       : # Date          : date du document
            WOSTCHGTYP=[M]CHGTYP                                    : # Type de cours : Type de cours du document
        Endif
        MONTORG(0)      =  [M:SOH0]OST
        MONTORG(1)      =  [M:SOH0]OSTAUZ
    #    Call CONVERT([M:SOH0]CUR,VALEUR,GLOCALDEV,[M]CHGTYP,date$,MONTORG(0),MONTDES(0),SPSTAT) From TRTDEV
    #    Call CONVERT([M:SOH0]CUR,VALEUR,GLOCALDEV,[M]CHGTYP,date$,MONTORG(1),MONTDES(1),SPSTAT) From TRTDEV
        Call CONVERT([M:SOH0]CUR,VALEUR,GLOCALDEV,WOSTCHGTYP,WOSTDAT,MONTORG(0),MONTDES(0),SPSTAT) From TRTDEV
        Call CONVERT([M:SOH0]CUR,VALEUR,GLOCALDEV,WOSTCHGTYP,WOSTDAT,MONTORG(1),MONTDES(1),SPSTAT) From TRTDEV
        [M:SOH0]OST     = MONTDES(0)
        [M:SOH0]OSTAUZ  = MONTDES(1)
    Endif
    # --> Recalcul des montants de facturation
    If [M:SOH3]NBFAC <> 0
       For I = 0 To [M:SOH3]NBFAC-1
          If [M:SOH3]AMTCOD(I) = 2
              [M:SOH3]FORMAT(I) = "NZ:"+[F:TCU]CURFMT1
             Call CONVERT([M:SOH0]CUR, VALEUR, GLOCALDEV, [M]CHGTYP, date$, [M:SOH3]INVDTAAMT(I),MONTANT,SPSTAT) From TRTDEV
             [M:SOH3]INVDTAAMT(I) = MONTANT
          Endif
       Next I
    Endif
    
    #If GACTMUL=2
    # Alimentation du format des colonnes frais/remise
    Call ALIFORREM (2, GFLAG, "SOH4", 0, VALEUR) From TRTPRICE
    #Endif
    
    [M:SOH0]CUR = VALEUR
    
    Affzo [M:SOH3]1-99
    Affzo [M:SOH0]CUR
    Affzo [M:SOH4]5
    
    # On a pas fait de recherche tarif : on fera une conversion
    If [M:SOH4]NBLIG <> 0 & GTARFLG = ""
        Local Char    WZONCOU    : WZONCOU = "CUR"
        Local Char    WANCCUR    : WANCCUR=[M:SOH1]CUR
        Local Char    WANCVACBPR : WANCVACBPR=[M:SOH1]VACBPR
        Local Integer WANCPRITYP : WANCPRITYP=[M:SOH1]PRITYP
        [M:SOH1]CUR=VALEUR
    #    GTARFLG = "C" :
        Gosub RECALC_LIGNE From SUBSOHB
    Endif
    Raz GTARFLG
    
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #--only if there are scheduling invoices filled on order's lines
    If [M:SOH4]NBLIG>0 and sigma(0,[M:SOH4]NBLIG-1,[M:SOH4]DINVCND(indcum)<>"")>1
      [M:SOH3]INVCNDTOUPD=[V]CST_AYES
    Endif
    # End issue 107888
    
    End
    # --------------------------------------- PRITYP ---------------------------------
    ########################################
    Subprog AM_PRITYP(VALEUR)
    Variable Integer VALEUR
    
    # On a pas fait de recherche tarif : on fera juste la bascule de prix
    If [M:SOH4]NBLIG <> 0 & GTARFLG = ""
    #    GTARFLG = "P" :
        Local Char    WZONCOU    : WZONCOU = "PRITYP"
        Local Char    FFLGMOD(1)
        Local Char    WANCCUR    : WANCCUR=[M]CUR
        Local Char    WANCVACBPR : WANCVACBPR=[M]VACBPR
        Local Integer WANCPRITYP : WANCPRITYP=[M]PRITYP
        [M]PRITYP = VALEUR
        Gosub RECALC_LIGNE From SUBSOHB
    Endif
    Raz GTARFLG
    
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #--only if there are scheduling invoices filled on order's lines
    If [M:SOH4]NBLIG>0 and sigma(0,[M:SOH4]NBLIG-1,[M:SOH4]DINVCND(indcum)<>"")>1
      [M:SOH3]INVCNDTOUPD=[V]CST_AYES
    Endif
    # End issue 107888
    
    End
    # --------------------------------------------------------------------------------
    #                                        Ecran SOH2
    # --------------------------------------------------------------------------------
    # --------------------------------------- STOFCY ---------------------------------
    ########################################
    Subprog C_STOFCY(VALEUR)
    Variable Char    VALEUR()
    If [M:SOH4]NBLIG<>0 & VALEUR<>[M]STOFCY Gosub CTR_STOFCY From SUBSOHB Endif
    End
    # --------------------------------------- LASDLVNUM ---------------------------------
    ########################################
    Subprog IB_LASDLVNUM
    If GFONC1 = "GESSDH" | [M]LASDLVNUM = "" | GREP <> "" Raz GBOUT1 : Endif
    End
    # --------------------------------------- DEMDLVDAT ---------------------------------
    ##########################################################################
    ## Etiquette ajoutée par le superviseur 19/11/2003 08:03:23 (LD)
    ##########################################################################
    Subprog C_DEMDLVDAT(VALEUR)
    Variable Date    VALEUR
    Local    Date    WDEMDLVDAT : WDEMDLVDAT=VALEUR
    
    # --> Vérification de la date de livraison demandée
    Call CTLUVYBPD(WDEMDLVDAT, [M:SOH1]BPAADD, [M:SOH0]BPCORD, 0) From TRTVENCTL
    If mkstat=2
        Local Integer WOK : WOK=2
        Call AVERTIR(mess(496,197,1)-":"-format$(GFMDAT,WDEMDLVDAT)-":"-GMESSAGE, WOK) From GESECRAN : Raz GMESSAGE :#--CPO 83985 GFMDAT au lieu de GFMD
        If WOK=1 : End : Endif
        mkstat=0
    Endif
    VALEUR=WDEMDLVDAT
    End
    ########################################
    Subprog AM_DEMDLVDAT(VALEUR)
    Variable Date    VALEUR
    # Controle lié à l'inter-site
    Gosub CTR_BETFCY From SUBSOHB : If mkstat=2 End Endif
    # --> Recalcul date expedition
    Call CALC_SHIDAT(VALEUR, [M:SOH2]DAYLTI, [M:SOH2]STOFCY, 1, 1, [M:SOH0]ORDDAT, [M:SOH2]SHIDAT) From TRTVENDAT
    #If mkstat Call MESSAGE (mess(278,192,1)-format$(GFMD,[M:SOH2]SHIDAT)-"\"-GMESSAGE) From GESECRAN : Endif
    Affzo [M:SOH2]SHIDAT
    End
    # --------------------------------------- DAYLTI ---------------------------------
    ########################################
    Subprog AM_DAYLTI(VALEUR)
    Variable Decimal VALEUR
    # --> Recalcul date expedition
    Call CALC_SHIDAT([M:SOH2]DEMDLVDAT, VALEUR, [M:SOH2]STOFCY, 1, 1, [M:SOH0]ORDDAT, [M:SOH2]SHIDAT) From TRTVENDAT
    #If mkstat Call MESSAGE (mess(278,192,1)-format$(GFMD,[M:SOH2]SHIDAT)-"\"-GMESSAGE) From GESECRAN : Endif
    Affzo [M:SOH2]SHIDAT
    End
    # --------------------------------------- SHIDAT ---------------------------------
    ########################################
    Subprog C_SHIDAT(VALEUR)
    Variable Date    VALEUR
    If VALEUR >  [M:SOH2]DEMDLVDAT
        Local Integer WOK : WOK=2
        # Issue X3-125879 - 2019-05-09 by SR : Add the name of the field
        Call AVERTIR (mess(184,197,1)-":"-mess(33,192,1), WOK) From GESECRAN : Raz GMESSAGE
        If WOK=1 mkstat=2 : End : Endif
    Endif
    End
    # --------------------------------------- DME ---------------------------------
    ##########################################################################
    ## Etiquette ajoutée par le superviseur 06/07/2004 16:01:31 (LD)
    ##########################################################################
    Subprog C_DME(VALEUR)
    Variable Integer VALEUR
    If !find (GREP, "C","D") & [M]BETFCY=2 & [M:SOH0]ORIFCY<>[M:SOH0]SALFCY
        # Commande inter-sites générée à partir des achats
        # On ne peut aller que du + restrictif vers le - restrictif pour ne pas déphaser les ctrls sur la cde d'achat
        # Commande complète (3) -> Ligne complète (2) -> Livraison partielle autorisée (1)
        If VALEUR > [M:SOH2]DME mkstat=2 : GMESSAGE=mess(74,187,1)-"\"-mess(294,192,1) : Endif
    Endif
    End
    ########################################
    Subprog AM_DME(VALEUR)      : # --- Web - Obligatoire - Synchrone
    Variable Integer VALEUR
    If VALEUR = 3
    #    Diszo [M:SOH2]STOFCY
        Diszo [M:SOH4]DBPAADD, DSTOFCY, DDLVPIO, DDRN, DMDL, DBPTNUM
    Else
    #    Actzo [M:SOH2]STOFCY
        Actzo [M:SOH4]DBPAADD, DSTOFCY, DDLVPIO, DDRN, DMDL, DBPTNUM
    Endif
    End
    # --------------------------------------- ALLTYP ---------------------------------
    ########################################
    Subprog AM_ALLTYP(VALEUR)    : # --- Web - Faible - Synchrone
    Variable Integer VALEUR
    # --> On modifie forcément toutes les lignes détails (sinon cela n'a aucun sens)
    If [M:SOH4]NBLIG <> 0
       Local Char    WZONCOU    : WZONCOU = "ALLTYP"
       Local Char    FFLGMOD(1) : FFLGMOD = "1"
       Local Char    WANCCUR    : WANCCUR=[M]CUR
       Local Char    WANCVACBPR : WANCVACBPR=[M]VACBPR
       Local Integer WANCPRITYP : WANCPRITYP=[M]PRITYP
       Gosub RECALC_LIGNE From SUBSOHB
    Endif
    End
    # --------------------------------------------------------------------------------
    #                                        Ecran SOH3
    # --------------------------------------------------------------------------------
    # --------------------------------------- UNL ---------------------------------
    Subprog AM_UNL(VALEUR)
    Variable Integer VALEUR
    
    # Si valeur à oui et commande bloquée ou en dépassement d'en-cours: On débloque la commande
    If VALEUR = 2 & find([M:SOH1]CDTSTA,2,3)
        [M:SOH1]CDTSTA = 1
    Elsif VALEUR = 1
    # Si valeur à non il faut recalculer l'état crédit
        Call SDCDTSTA("",[M]BPCORD,[M]CHGTYP,0,[M:SOH1]CUR,[M]ORDDAT,VALEUR,1,[M]CDTSTA,[M]OST,[M]OSTAUZ) From TRTVENCDT
    Endif
    Affzo [M:SOH1]CDTSTA :
    End
    ########################################
    # 107890 : Scheduled invoices : (LD:14/01/16)
    # --------------------------------------- UNL ---------------------------------
    ########################################
    Subprog C_VCRINVCNDDAT(VALEUR)
    Variable Date    VALEUR
    
    If [M:SOH0]SOHCAT=1 & VALEUR < [M:SOH0]ORDDAT
        GMESSAGE=mess(32,192,1)-format$(GFMDAT4,[M:SOH0]ORDDAT): mkstat=2
    Endif
    
    End
    ########################################
    Subprog AM_VCRINVCNDDAT(VALEUR)
    Variable Date    VALEUR
    # The system proposes to recalculate scheduled invoices for lines that are not partially invoiced
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    Local Integer WOKCPO
    Local Date    WCPO_DAT : WCPO_DAT = [M:SOH3]VCRINVCNDDAT
    
    #--only if there are scheduling invoices filled on order's lines
    If [M:SOH4]NBLIG>0 and sigma(0,[M:SOH4]NBLIG-1,[M:SOH4]DINVCND(indcum)<> "")>0
      WOKCPO=2
      Call OUINON(mess(498,192,1)+"\"+"("+mess(518,192,1)-"'"+mess(1,2419,1)+"'"+")",WOKCPO) From GESECRAN
      If WOKCPO=2
        GERR=0
        [M:SOH3]VCRINVCNDDAT=VALEUR
        Gosub AM_ORDDAT_UPDATE_INVCNDDAT From LIBSAL_INVCND_SOH
        If GERR=1
          [M:SOH3]VCRINVCNDDAT = WCPO_DAT
          mkstat=2 : End
        Endif
      Endif
    Endif
    # End issue 107888
    End
    # 107890 : Scheduled invoices : (LD:14/01/16)
    ######################################################################################
    Subprog AM_PTE(VALEUR)
    Variable Char    VALEUR()
    
    # 78411 Sage Exchange
    If func AFNC.ACTIV("SEPP")
      If !clalev([F:SEU])  Local File SEAUTH [SEU] Endif
      # If Payment terms were SE and no longer are - void any outstanding Auth
      If !func SEPPLIB.SEPP_DOC(VALEUR) & func SEPPLIB.SEPP_DOC([M:SOH3]PTE) & func SEPPCDT.SEPP_OK(2,[M:SOH0]SOHNUM,1)
    &  & !find(GREP,"C","D") & find([F:SEU]STAFLG,3,8)
        Call MESSAGE(mess(38,2092,1)) From GESECRAN
      Endif
    
      # If payment terms were or are now Sage Exchange, recalc credit hold
      If (func SEPPLIB.SEPP_DOC(VALEUR) | func SEPPLIB.SEPP_DOC([M]PTE))
        [F:SOH]PTE = VALEUR
        Call SDCDTSTA([M]SOHNUM,[M]BPCORD,[M]CHGTYP,0,[M:SOH1]CUR,[M]ORDDAT,[M]UNL,1,[M]CDTSTA,[M]OST,[M]OSTAUZ) From TRTVENCDT
        Affzo [M:SOH1]CDTSTA
        # TTD-114631.sn: Creation only.
        If GREP = "C"
          If NBLIG > 0
            Raz [M:SOH4]WALLQTY       # Qty to allocate
            Raz [M:SOH4]WALLQTYSTU    # STK qty. to be allocated (Hidden field)
          Endif
          Affzo [M:SOH4]WALLQTY, WALLQTYSTU
        Endif
        # TTD-114631.en
      Endif
    Endif
    
    End
    ######################################################################################
    Subprog C_PTE(VALEUR)
    Variable Char    VALEUR()
    
    # 78411 Sage Exchange
    If func AFNC.ACTIV("SEPP")
      If func SEPPLIB.SEPP_DOC(VALEUR)
    
        # TODAN-120946. Payment term was not SE and now SE. So check the line for non-deliverable item
        # Note: Need to move the call to SUBSOHA to avoid the -
        # SUBSOH: Error No 128 -  - Number of instructions or expressions too large
        Gosub VALIDATE_INVOICING_TERM From SUBSOHA : If GOK < 1: End : Endif
    
        [M:SOH2]ODL = 2 : [M:SOH3]IME = 1
        Affzo [M:SOH2]ODL : Affzo [M:SOH3]IME
        Grizo [M:SOH2]ODL : Grizo [M:SOH3]IME
      Else
        Actzo [M:SOH2]ODL : Actzo [M:SOH3]IME
      Endif
    Endif
    
    End
    # --------------------------------------- LASINVNUM --------------------------------
    ########################################
    Subprog IB_LASINVNUM
    If GFONC1 = "GESSIH" | [M]LASINVNUM = "" | GREP <> "" Raz GBOUT1 Endif
    End
    # --------------------------------------- SQHNUM --------------------------------
    ########################################
    Subprog IB_SQHNUM
    If GFONC1 = "GESSQH" | [M]SQHNUM = "" | GREP <> "" Raz GBOUT1 Endif
    End
    # --------------------------------------- NBAXE --------------------------------
    ########################################
    Subprog C_NBAXE
    #If !find(status,1,4,5,20,21,26,92,93) End : Endif
    ##----- Contrôle sections obligatoires -----#
    #If GCCECOD=1
    #  For nolign=1 To GOPTCANA
    #    If [M]CCE(nolign-1)="" & evalue("GANASAI"+num$(nolign))=2
    #       mkstat=2 : GMESSAGE= mess(177,199,1) : Break
    #    Endif
    #  Next nolign
    #Endif
    #----------------#
    # Contrôle NBAXE #
    #----------------#
    If !find(status,1,4,5,20,21,26,92,93) | GIMPORT End : Endif
    #----- Contrôle Sections d'entête obligatoires si saisissables -----#
    If [M:SOH3]NBAXE>0 & GHEADIE=1
      Local Integer I
      For I=1 To [M:SOH3]NBAXE
        If CCE(I-1)="" & GOBLDIE(I)=2
          mkstat=1 : GMESSAGE= mess(46,106,1)-GDIE(I) : Break
        Endif
      Next I
    Endif
    End
    # --------------------------------------- NBFAC --------------------------------
    ##########################################################################
    Subprog C_NBFAC
    # --- Si l'on sort du tableau, calcul de la valeur TTC (calcul facture complet)
    If GIMPORT         : End : Endif
    If [M:SOH4]NBLIG=0 : End : Endif
    If status >= 65 & status <=  100 End Endif
    If find(status,7,27,28) | status >= 1792 End Endif
       If dim(G_MOD_DTAAMT)>0 & G_MOD_DTAAMT>0
          # 101874 : V9 : Taxe code control
          # Valuation is always done in this case
          #If dim(GVALTTCSOH)>0 & dim(GVALTTC)>0 : GVALTTC=GVALTTCSOH : Endif
          GVALTTC=2
          #---- Paramètres complementaires appel valorisation
          # PARAM_T(0) : Flag contrôle des taxes             (1=Non/2=Oui)
          # PARAM_T(1) : Lecture de la trace par le sous-pro (1=Non/2=Oui)
          # PARAM_T(2) : Flag retour                         (1=KO/2=OK)
          Local    Char     PARAM_T (25) (0..10)
          PARAM_T(0)="1"      : # Pas de contrôle des taxes
          PARAM_T(1)="1"      : # Pas de lecture de la trace
          PARAM_T(2)="0"
          Call VALTTC ("GESSOH", PARAM_T) From TRTVENFACR
          Raz G_MOD_DTAAMT
          If PARAM_T(2)="1" mkstat=2 : End Endif
          # 101874
       Endif
    End
    
    #-------- A supprimer ultérieurement
    Subprog AP_NBFAC
    End
    
    ########################################
    Subprog AM_INVDTAAMT(VALEUR)
    Variable Decimal VALEUR
    
        # ACA - On vérifie que la saisie ne s'est pas faite avec trop de décimales
        # Possible à cause du picking qui ajoute 2 décimales pour les éléments calculés
        #Fq76549-Gbn
        If [M:SOH3]AMTCOD(nolign-1)=1
    &       and [M:SOH3]INVDTATYP(nolign-1)<>3
    &       and arr(VALEUR,[F:TCU]CURRND) <> VALEUR : # Trop de decimales
                GERR=1 : GMESSAGE=mess(303,184,1)-mess(134,126,1)-":"-num$([F:TCU]DECNBR)
                mkstat=1
            End
        Endif
    
        # ACA - On retabli le bon nombre de decimales pour le format
        If [M:SOH3]AMTCOD(nolign-1)=1
    &       and [M:SOH3]FORMAT(nolign-1)<>func TRTX3FNC.GETFMTREM(1)
                [M:SOH3]FORMAT(nolign-1)=func TRTX3FNC.GETFMTREM(1)
        Endif
    
        If dim(G_MOD_DTAAMT)<=0 : Global Integer G_MOD_DTAAMT : Endif
        G_MOD_DTAAMT += 1
        If GREP="C"
            Call ADD_NBTRF(0, [M:SOH3]INVDTA(nolign-1), VALEUR) From SUBSFIT
        Endif
    
        #--CPO 102340 Avenants lignes mis à jour si modification en-tête
        #--Il faut enrichir la correction 90362 qui met à 1 les UPDFLG si pas d'éléments répartis
        #--Mettre le flag à 1 uniquement si passage d'un élément réparti à 0
        If [M:SOH3]INVDTAAMT(nolign-1)<>0 and VALEUR = 0
          #--Vérifier que l'élément est réparti sur lignes
          If clalev([F:SFI])=0 : Local File SFOOTINV [SFI] : Endif
    
          If [M:SOH3]INVDTA(nolign-1)<>[F:SFI]SFINUM
            Read [F:SFI]SFI0 = [M:SOH3]INVDTA(nolign-1)
            If fstat : Raz [F:SFI] : Endif
          Endif
    
          If find([F:SFI]DSPLIN,2,3,4)>0
            If dim(G_PREV_DSPLIN)<0 : Global Integer G_PREV_DSPLIN : Endif
            G_PREV_DSPLIN = 1
          Endif
        Endif
        #--/102340
    End
    # --------------------------------------- PRFNUM --------------------------------
    ########################################
    Subprog IB_PRFNUM
    If GFONC1 = "GESSIH" | [M]PRFNUM = "" | GREP <> "" Raz GBOUT1 Endif
    End
    #####################################################################
    #               LES ACTIONS SUR LES ZONES ECRAN DETAIL              #
    #####################################################################
    # -------------------------------------- NBLIG ------------------------------
    #                         --- Web - Obligatoire - Synchrone
    Subprog IB_NBLIG
    Local Integer NOL : NOL=nolign-1
    
    # Bouton   1 : Solde d'une ligne de commande
    # Bouton   2 : Calcul tarif
    # Bouton   3 : Visu info qté cde vente
    # Bouton   4 : If Deliverable Item   : Visu détail allocation   : # 107890 : Scheduled invoices : (LD:21/12/15)
    # Bouton   4 : If Undeliverable Item :Timetable (Echéancier)    : # 107890 : Scheduled invoices : (LD:21/12/15)
    # Bouton   5 : Stock par site
    # Bouton   6 : Saisie texte ligne
    # Bouton   7 : Visu avenants ligne commande
    # Bouton   8 : Explication du prix
    # Bouton   9 : Devis
    # Bouton  10 : Contrats de service
    # Bouton  11 : Configurateur
    # Bouton  12 : Allocations manuelles
    # Bouton  13 : Detail valorisation
    # Bouton  14 : Ordre de fabrication
    # Bouton  15 : Commande
    # Bouton  16 : derniers articles commandés
    # SEGAY 05/12/2008 : branchement traçabilité pièces
    # Bouton  17 : traçabilité pièces
    # Bouton  18 : affectation(s)
    ## Bouton  19 : Planification multi-niveau (v6.2) - FQ 64659 GA 08/2010
    # Bouton  19 : Product information - DF 79831
    
    Raz GBOUT18, GBOUT14
    
    # SEGAY 05/12/2008 : branchement traçabilité pièces
    If find(GREP,"C","D") or find("CONSPIV",GNAVIG(1..GPILNAV)) Then Raz GBOUT17 Endif
    
    # Call IB_NOTECHECK([M:SOH4]ITMREF(NOL),"ITMREF",20)  From TRTNTSCTL # product notes EWI 86290
    
    If nolign <= [M]NBLIG
        GBOUT3=mess(164,198,1)
        GBOUT9=mess(121,198,1)-[M]DETSQHNUM(nolign-1)
        If GREP = "" Then  # FGR 19/03/2014 : X3SUIVI95697 : GBOUT14 disponible slt si GREP=""
          #MAE, EVOL_ERGO
          # --> déf. bouton ordre de fabrication et commandes
          # FQ 69784 GA 12/2010 partager même bouton GBOUT14, car GBOUT15 est utilisé pour MULTIWX
          #                     + ajout cas d'une contremarque EO
          If [M:SOH4]FMINUM(NOL) <> ""
              # GH 06/07/2012 bug 83344
              Local Integer FMI
              [L]FMI = [M:SOH4]FMI(NOL)
              If [L]FMI = 5
                 If !clalev([F:MFG]) : Local File MFGHEAD [MFG] : Endif
                 Look [MFG]MFG0 =  [M]FMINUM(nolign-1)
                 If fstat : [L]FMI=6 : Endif
              Endif
              #
              If GFONC1 <> "GESMFG" & [L]FMI=5 : # GH 06/07/2012 bug 83344 : # & [M:SOH4]FMI(NOL) = 5
                  GBOUT14 = mess(166,198,1)-[M]FMINUM(nolign-1) : # WO
                  If dim([M:SOH4]WOBJ1)>0 : [M:SOH4]WOBJ1 = "MFG" : Endif
              Elsif GFONC1 <> "GESSCO" & [L]FMI = 6 : # GH 06/07/2012 bug 83344 : # & [M:SOH4]FMI(NOL) = 6
                  GBOUT14 = mess(641,197,1)-[M]FMINUM(nolign-1) : # EO
                  If dim([M:SOH4]WOBJ1)>0 : [M:SOH4]WOBJ1 = "SCO" : Endif
              Elsif GFONC1 <> "GESPOH"
                  GBOUT14 = mess(191,198,1)-[M]FMINUM(nolign-1) : # PO
                  If dim([M:SOH4]WOBJ1)>0 : [M:SOH4]WOBJ1 = "POH" : Endif
              Endif
          Else
              Raz GBOUT14
          Endif
        Else
          Raz GBOUT14
        Endif
        If [M]DETSQHNUM(NOL) = "" | GFONC1 = "GESSQH" Raz GBOUT9 Endif
    # --> Déf. bouton stock site
        If [M]STOMGTCOD(NOL) = 1 : Raz GBOUT5 : Endif
        If [M]STOMGTCOD(NOL) > 1 & [M]SOQSTA(NOL) <> 3 : GBOUT18 = mess(467,198,1) : Endif
    # --> Déf. bouton détail allocation
    # 107890 : Scheduled invoices : (LD:18/12/15)
    # This part has been moved because Scheduled invoices can be accessible even if the order is closed
    # Because of the limit of the number of button, we have to use one button for severals purposes :
    #    If [M]STOMGTCOD(NOL) = 1 | [M]DALLTYP(NOL) = 1 | ([M]ALLQTY(NOL)=0 & [M]SHTQTY(NOL)=0)
    #    If [M]STOMGTCOD(NOL) = 1 | ([M]ALLQTY(NOL)=0 & [M]SHTQTY(NOL)=0)
    #       Raz GBOUT4
    #    Endif
        Raz GBOUT4
        If [M]DLVFLG(nolign-1)=2
            # Deliverable Item  : Allocation detail
            If [M]STOMGTCOD(NOL)>1 & ([M]ALLQTY(NOL)+[M]SHTQTY(NOL)<>0)
                Call TEXTE(15286, GBOUT4) From OBJDIV
            Endif
        Else
            # Undeliverable Item  : Timetable (Echéancier)
            If [M:SOH4]DINVCND(nolign-1)<>""
    #            Call TEXTE(25808, GBOUT4) From OBJDIV
                Call TEXTE(56726, GBOUT4) From OBJDIV   # SAM 107888  Scheduled invoices (JUCON 14/11/16)
            Endif
        Endif
    # 107890 : Scheduled invoices : (LD:18/12/15)
    # --> Si la cde est soldée aucun bouton actif
        If [M:SOH1]ORDSTA = 2
            # 107890 : Scheduled invoices : (LD:12/07/16)
            #Raz GBOUT1, GBOUT2, GBOUT4, GBOUT11, GBOUT12, GBOUT15 : # GH 22/10/12 bug 84890 ajout de GBOUT15
            Raz GBOUT1, GBOUT2, GBOUT11, GBOUT12, GBOUT15 : # GH 22/10/12 bug 84890 ajout de GBOUT15
            # 107890 : Scheduled invoices : (LD:12/07/16)
            If [M]LINREVNUM(NOL) = 0 Raz GBOUT7 : Endif
            If [M]CONNUM(NOL) = ""   Raz GBOUT10 : Endif : End
        Endif
    #   --> Pas de solde si solde non autorisé ou si la ligne de commande n'est pas créée
        If [M:SOH2]ORDCLE=1 | [M]CREFLG(NOL)=0 Raz GBOUT1 Endif
    #   --> Pas de solde/désolde si cde inter-site générée par le module achat
        If [M:SOH0]ORIFCY<>"" & [M:SOH0]ORIFCY<>[M:SOH0]SALFCY Raz GBOUT1 Endif
    #   --> Pas de solde pour les composants de kit/sous-traité
        If find ([M:SOH4]LINTYP (NOL),3,4,5,11,12,13) Raz GBOUT1
        Else
    #       --> Ligne déjà soldée
            If [M:SOH4]SOQSTA(NOL) = 3
    #       --> Ligne à désolder sf si totalement livrée/facturée
            # 107888 : Scheduled invoices : (LD:10/05/16)
    #           If ([M:SOH0]SOHCAT <> 3 & ([M]DLVQTY(NOL) + [M]ODLQTY(NOL)) >= [M]QTY(NOL)) |
    #&             ([M:SOH0]SOHCAT =  3 & ([M]INVQTY(NOL) + [M]ODLQTY(NOL)) >= [M]QTY(NOL)) #|
    ##&             ([M:SOH4]CONNUM(NOL) <> "")  # FGR 13/02/2014 : X3SUIVI96419
    #                Raz GBOUT1
    #           Endif
    
    #       --> Ligne à désolder sf si totalement livrée/facturée
    #           Commande normale/prêt et ligne livrable désolde sf si Totalement livrée
    #           Commande normale et ligne non livrable  désolde sf si Totalement facturée
    #           Commande à facturation directe          désolde sf si Totalement facturée
               If ([M:SOH0]SOHCAT <> 3 & [M]DLVFLG(NOL)=2    & ([M]DLVQTY(NOL) + [M]ODLQTY(NOL)) >= [M]QTY(NOL)) |
    &             ([M:SOH0]SOHCAT <> 3 & [M]DLVFLG(NOL)=1   & ([M]INVQTY(NOL) + [M]ODLQTY(NOL)) >= [M]QTY(NOL)) |
    &             ([M:SOH0]SOHCAT =  3 & ([M]INVQTY(NOL) + [M]ODLQTY(NOL)) >= [M]QTY(NOL))
                    Raz GBOUT1
               Endif
            # 107888 : Scheduled invoices : (LD:10/05/16)
    #       --> Ligne n'est pas soldée
            Else
    #       --> Ligne à solder sf si préparée
               If ([M]LPRQTY(NOL) + [M]OPRQTY(NOL) + [M]PREQTY(NOL)) <> 0 Raz GBOUT1 Endif
               # FGR 13/02/2014 : X3SUIVI96419 (début)
               If [M:SOH4]CONNUM(NOL) <> "" Then
                 # Si on a désoldé c'est pour supprimer la ligne : on n'a pas de droit de solder
                 Raz GBOUT1
               Endif
               # FGR 13/02/2014 : X3SUIVI96419 (fin)
            Endif
        Endif
    # --> Déf. bouton Recalcul tarif si ligne non soldée, livrée, facturée, gratuit
    #   --> Pas de recalcul si ligne soldée, livrée, facturée ou si gratuit
        If [M]SOQSTA(NOL) =  3 |
    &      [M]ODLQTY(NOL) <> 0 | [M]DLVQTY(NOL) <> 0 | [M]INVQTY(NOL) <> 0 |
    &      [M]FOCFLG(NOL) = 3
           Raz GBOUT2
        Endif
        # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
        # If the sales order line is linked to a progress billing
        # If there is scheduled invoices linked to a billing situation not invoiced we can't modify the price (to avoid bad price when invoicing)
        # So price calculation has to be inhibited
        # This working flag indicates if, for the sales order line, there is scheduled invoices linked to a billing situation not invoiced
        If dim([M:SOH4]PBILDTOINV) > 0 & [M:SOH4]PBILDTOINV(NOL)=2
           Raz GBOUT2
        Endif
        # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
    
    # --> Déf. bouton détail allocation
    ## 107890 : Scheduled invoices : (LD:18/12/15)
    ## Because of the limit of the number of button, we have to use one button for severals purposes :
    ## This part has been moved because Scheduled invoices can be accessible even if the order is closed
    ##    If [M]STOMGTCOD(NOL) = 1 | [M]DALLTYP(NOL) = 1 | ([M]ALLQTY(NOL)=0 & [M]SHTQTY(NOL)=0)
    ##    If [M]STOMGTCOD(NOL) = 1 | ([M]ALLQTY(NOL)=0 & [M]SHTQTY(NOL)=0)
    ##       Raz GBOUT4
    ##    Endif
    #    Raz GBOUT4
    #    If [M]DLVFLG(nolign-1)=2
    #        # Deliverable Item  : Allocation detail
    #        If [M]STOMGTCOD(NOL)>1 & ([M]ALLQTY(NOL)+[M]SHTQTY(NOL)<>0)
    #            Call TEXTE(15286, GBOUT4) From OBJDIV
    #        Endif
    #    Else
    #        # Undeliverable Item  : Timetable (Echéancier)
    #        If [M:SOH4]DINVCND(nolign-1)<>""
    #            Call TEXTE(25808, GBOUT4) From OBJDIV
    #        Endif
    #    Endif
    ## 107890 : Scheduled invoices : (LD:18/12/15)
    
    # --> Déf. bouton Avenants si masque avenant existe et ligne avec avenant
    #   If filinfo(filpath(adxrob(0),"WK"+num$([F:SLT]STRTYP)+[F:SLT]STRNUM+"A","srm",0),0)>=0
    #   ( pour l'instant : pas d'ecran d'avenant généré par la transaction )
        If [M]LINREVNUM(NOL) = 0
           Raz GBOUT7
        Endif
    #   Endif
    # --> Déf. bouton allocation manuelle
    #   Si kit/sous-traité, garder la cohérence sur le type allocation
        If [M]UPDFLG(NOL)<>0 | [M]DEMSTA(NOL)<>1 | find([M]CDTSTA,2,5) |
    &      [M]STOMGTCOD(NOL) = 1 | [M]SOQSTA(NOL) =  3 |
    &      (find([M]LINTYP(NOL),3,4,5,11,12,13) & [M]DALLTYP(NOL)=1) |
    &      sum([M:SOH4]OPRQTY(NOL),[M:SOH4]PREQTY(NOL),[M:SOH4]ODLQTY(NOL),[M:SOH4]DLVQTY(NOL))>=sum([M:SOH4]QTY(NOL)) |
    &      (GAPPSOH>1 & (GSOHAPPORD=1 | GSOHAPPALL=1) & [M:SOH1]APPFLG<=2) |
    &      (find([M]LINTYP(NOL),3,4,5,11,12,13) & [M:SOH4]WALLQTY(NOL)=0)    : # 93012 : Pas de bt si composant kit non alloué car pas de saisie possible de la qté à allouer (Il faut passer par le
    # composé)
    #&      (GAPPSOH>1 & (GSOHAPPORD=1 | GSOHAPPALL=1) & [M:SOH1]APPFLG<=2)
    #&      sum([M:SOH4]LPRQTY(NOL),[M:SOH4]OPRQTY(NOL),[M:SOH4]PREQTY(NOL),[M:SOH4]ODLQTY(NOL),[M:SOH4]DLVQTY(NOL))>=sum([M:SOH4]QTY(NOL)) | : # 100013
    #&      sum([M:SOH4]LPRQTY,[M:SOH4]OPRQTY,[M:SOH4]PREQTY,[M:SOH4]ODLQTY,[M:SOH4]DLVQTY)>=sum([M:SOH4]QTY) | : # 90571
           Raz GBOUT12
        Endif
        # Ctrl autorisation bouton allocation manuelle
        If !find (GREP, "C", "D")
            GBIDC2="A": GFCY=[M]SALFCY : Gosub AUTORIS_OPT From CONTX3
            If !GBIDI2  Raz GBOUT12 Endif
        Endif
        #Modif CRM 20 Septembre 2000
        If [M:SOH4]CONNUM(NOL) = ""
            Raz GBOUT10
        Else
           If GMODU(12) = 2
                GBOUT10 = mess(293, 196, 2) #Contrats de service;
            Else
                Raz GBOUT10
            Endif
        Endif
        # Pas de configurateur si commande soldé ou gratuit (pb insertion)
        If [M:SOH1]ORDSTA=2 | [M:SOH4]FOCFLG(NOL)=3
           Raz GBOUT11
        Endif
        # Pas de configurateur si composant (pb insertion)
    ###    If ([M:SOH4]LINTYP(NOL)>2 & [M:SOH4]LINTYP(NOL)<6) | ([M:SOH4]LINTYP(NOL)>6 & [M:SOH4]LINTYP(NOL)<=9) |
    ###&      ([M:SOH4]LINTYP(NOL)>10 & [M:SOH4]LINTYP(NOL)<14)
        If find ([M:SOH4]LINTYP (NOL),3,4,5,7,8,9,11,12,13)
           Raz GBOUT11
        Endif
        If [M:SOH4]ITMREF(NOL) = "" Raz GBOUT16 Endif
    #   FQ 64659 GA 08/2010
    #   --> Pas de multi-niveau:
    #       - en création de la commande de vente
    #       - si on est venu depuis MULTIWOX
    #       - pour les composants de kit/sous-traité
    #       - si  tout est déjà affecté ou alloué, ou la contremarque déjà faite # GH 10/10/12 bug 84957 (cohérence avec le plan de travail)
        If find(GREP,"C","D")
    &    | find("MULTIWOX",GNAVIG(1..GPILNAV))
    &    | find ([M:SOH4]LINTYP (NOL),3,4,5,7,8,9,11,12,13)
    &    | [M:SOH4]FMINUM(NOL)<>""
            Raz GBOUT15    # FQ 69784 GA 12/2010 pb intégration avec module ETO: avant GBOUT19
        Else
            # Recherche de la qté encore affectable
            If !clalev([F:ORD]) : Local File ORDERS [ORD] : Endif
            Read [ORD]ORD3 = [M:SOH4]DSTOFCY(NOL);2;[M:SOH0]SOHNUM;[M:SOH4]SOPLIN(NOL);[M:SOH4]SOPLIN(NOL)
            GBIDD1 =  max(0,[F:ORD]RMNEXTQTY - [F:ORD]ALLQTY -[F:ORD]MTOQTY) * (fstat=0)
            If GBIDD1=0 :   Raz GBOUT15 : Endif
        Endif
        #Call IB_PRDINF([M:SOH4]ITMREF(NOL),19) From PRDINFLIB  # DF 79831 EWI 86290
    Else
        Raz GBOUT1, GBOUT2, GBOUT3, GBOUT4, GBOUT5, GBOUT6, GBOUT7, GBOUT8, GBOUT9, GBOUT12, GBOUT13
        Raz GBOUT14, GBOUT15, GBOUT16, GBOUT17, GBOUT18
        #GBOUT19, GBOUT20 # DF 79831, product notes EWI 86290
    Endif
    End
    
    ######################################################################################
    ## Etiquette ajoutée par le superviseur (écran SOH4) 09/11/2004 18:02:44 (LD)
    ######################################################################################
    Subprog AV_NBLIG
    
    # Issue 113880
    # This display (GERR=4) is no more possible with web client
    End
    # End issue 113880
    ## Si kit ou sous-traité, affichage au niveau du composé de la qté livrable lorsque l'on clique sur la ligne (status=71)
    #If status<>71 | nolign>[M]NBLIG | (!find(2,10, [M]LINTYP(0..[M]NBLIG-1)))  End Endif
    #GERR=4: GMESSAGE="                                  "
    #If find([M]LINTYP(nolign-1),2,10) & [M]DLBQTYSTU(nolign-1)<([M]ALLQTYSTU(nolign-1)+[M]SHTQTYSTU(nolign-1))
    #    Local Decimal WDLBQTY
    #    If [M]SAUSTUCOE(nolign-1)<>1
    #        WDLBQTY=[M]DLBQTYSTU(nolign-1)*(1/[M]SAUSTUCOE(nolign-1))
    #    Else
    #        WDLBQTY=[M]DLBQTYSTU(nolign-1)
    #    Endif
    #    Call QTEARR(WDLBQTY, [M]SAU(nolign-1)) From TRTDIV
    #    GMESSAGE=(mess(610,197,1)-num$(WDLBQTY)-[M]SAU(nolign-1))
    #Endif
    #End
    ########################################
    #                         --- Web - Obligatoire - Synchrone
    Subprog C_NBLIG
    Local Integer NOL
    
    # Valeurs de GMODIF :
    #    0 = Modification ligne
    #    1 = Suppression ligne
    #    2 = Nouvelle ligne
    #    3 = Suppression des composants kit          (suite à GMODIF=1)
    #    4 = Suppression des composants nomenclature (suite à GMODIF=1)
    
    # Issue X3-177254 - 20200520 by VAVIL : Fields that user must be able to change after the Electronic Signature - orders
    If func AFNC.ACTIV('KPO') > 0
      If dim([M:SOH1]SOHVALDATC) > 0 and dim([M:SOH1]SOHVALDAT) > 0 and [M:SOH1]SOHVALDAT <> [0/0/0]
        If [M:SOH1]SOHCFMFLG = 2 and (status = 73 | status = 82 | status = 65)
          mkstat = 2 : GMESSAGE = mess(23,2038,1) : End
        Endif
      Endif
    Endif
    # Issue X3-135076 end
    
    GMODIF=2
    
    If [M:SOH1]ORDSTA <> 2
       If [M:SOH4]NBLIG <> 0
          Diszo [M:SOH0]SOHTYP
          Diszo [M:SOH0]SALFCY
          If GREP <> "D" Diszo [M:SOH0]BPCORD Endif
    #      If [M:SOH2]DME = 3 Diszo [M:SOH2]STOFCY
    #      Else Actzo [M:SOH2]STOFCY Endif
       Elsif find (GREP, "C", "D")
          Actzo [M:SOH0]SOHTYP
          Actzo [M:SOH0]SALFCY
          Actzo [M:SOH0]BPCORD
    #      Actzo [M:SOH2]STOFCY
       Endif
       If sum([M:SOH4]ALLQTY)<>0 | sum([M:SOH4]SHTQTY)<>0 | sum([M:SOH4]WALLQTY)<>0
          Diszo [M:SOH2]ALLTYP
       Else
          Actzo [M:SOH2]ALLTYP
       Endif
    Endif
    
    # --> CONTRôLE D'insertion de lignes
    If status = 73 | status = 82 NOL=nolign-1 : Gosub TEST_INS From SUBSOHB : Endif
    
    # --> Contrôle de suppression de lignes
    If status = 65
        NOL=nolign-1 : GMODIF = 1 : Gosub TEST_ANU From SUBSOHB
        If mkstat End Endif
        GUPDAPPFLG=2 : # Raz signatures si suppression d'une ligne
    Endif
    
    If status = 68 | status= 83
        GMODIF = 1
        For NOL=nolign-1 To nolign1-1
            Gosub TEST_ANU From SUBSOHB
            If mkstat : Break : Endif
        Next NOL
        If mkstat End Endif
        GUPDAPPFLG=2 : # Raz signatures si suppression d'une ligne
    Endif
    # --> Contrôle de modification de lignes
    If status = 75
       NOL=nolign-1
       GMODIF=0
       Gosub TEST_MOD From SUBSOHB
    Endif
    If GMESSAGE = "" : GERR=4 : Endif
    
    End
    ########################################
    #                         --- Web - Obligatoire - Synchrone
    Subprog AVANT_NBLIG
    Local Integer NOL : NOL=nolign-1
    Local Integer WRETOUR
    Local Char    WNUMTEX(12)
    
    If GMODIF = 2
    # --> Création d'une ligne : Alimentation des zones venant de l'entête
       Call INIT_SOH(NOL, 1) From SUBSOHB
    Else
    # --> Lecture des fichiers en ligne
       Call LECT_FIC(NOL)    From SUBSOHB
    Endif
    
    #--CPO 79343
    If GMODIF=1 and GREP<>"C" and GSOHSUPPLIGDSP <> 999999
      Local Integer WTEMPDSP : Raz WTEMPDSP
      Call CTLSUPP_EXISTDSP("SOH",NOL,WTEMPDSP) From TRTVENDIV
      If WTEMPDSP=1
        If [M:SOH4]CREFLG(NOL)<>0
          GSOHSUPPLIGDSP = 999999 :#--CPO La suppression d'une ligne non pickée est définitive si on enregistre...
        Endif
      Endif
    Endif
    #--/CPO
    
    Call AVANT_LIGNE(NOL)  From SUBSOHB
    
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #--In order the keep the association nolign-1 and GSOHVCRINVCND_UPD(nolign-1)
    #--We are going to do an Insa/Dela instruction on GSOHVCRINVCND_UPD(..)
    If GMODIF=1
      Gosub AVANT_NBLIG_DINVCND_DEL From LIBSAL_INVCND_SOH
    Elsif GMODIF=2 #CPO 18/01/2016
      Gosub AVANT_NBLIG_DINVCND_INS From LIBSAL_INVCND_SOH
    Endif
    # End issue 107888
    End
    #############################################################################
    #    APRES_NBLIG     :    Web                                               #
    #                                                                           #
    #        Décomposée en 2 actions                                            #
    #                                                                           #
    #        1 - Traitement si fin sans validation                              #
    #          - Traitement de validation                                       #
    #          - Suppression d'un gratuit lié à une ligne                       #
    #          - Suppression d'une nomenclature                                 #
    #          - Modification d'une nomenclature si suppression du composé seul #
    #          - Modification d'une nomenclature si modification du composé     #
    #        2 - Création d'un gratuit                                          #
    #                                                                           #
    #############################################################################
    $P1_NBLIG
    #--nombre d'instructions trop important
    Gosub P1_NBLIG From SUBSOH1 # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    
    Return
    #############################################################################
    $P2_NBLIG
    
    #--nombre d'instructions trop important
    Gosub P2_NBLIG From SUBSOH1 # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    
    #Local Integer  ORI        : ORI=nolign-1
    #Local Integer  NL         : NL=nolign
    #Local Integer  FUNCTION   : FUNCTION=2
    #Local Integer  RET
    #
    ##---------------------------------------------------------------------------#
    ## Création d'une ligne                                                      #
    ## --> Génération des gratuits                                               #
    ##---------------------------------------------------------------------------#
    #If GMODIF = 2 & GFOCITMREF <> ""
    #    If !GIMPORT | (GIMPORT & ((dim(G_FOCFLG)>0 & G_FOCFLG=0) | (dim(G_FOCFLG)<=0)))
    #    #   Recherche de l'article origine si on est positionné sur un composant
    #        If !find([M]LINTYP(ORI),1,2,6,10)
    #            While !find([M]LINTYP(ORI),1,2,6,10) & ORI >= 0
    #                ORI-=1
    #            Wend
    #        Endif
    #        # Mode web service : Pb avec les insertions de ligne
    #        # --> Le gratuit sera généré juste avt la création de la cde dans l'action VERIF
    #        #     Stockage de la référence du gratuit ds un tableau de globales
    #        #     Utilisation du chps [M:SOH4]FOCNUMLIG pour stocker, pour l'article à l'origine du gratuit,
    #        #     l'indice du gratuit ds le tableau de globales
    #        #     (Utiliser SOPLIN pour faire le lien n'est pas possible car à l'insertion des gratuits, tt est renuméroté)
    #        If dim(GWEBSERV)=1 & GWEBSERV=1
    #            GWEBNBGRA+=1
    #            GWEBFOCITMREF(GWEBNBGRA-1)=GFOCITMREF : GWEBFOCQTY(GWEBNBGRA-1)  =GFOCQTY
    #            GWEBFOCUOM(GWEBNBGRA-1)   =GFOCUOM    : GWEBFOCMOTIF(GWEBNBGRA-1)=GFOCMOTIF
    #
    #            [M:SOH4]FOCNUMLIG(ORI)=GWEBNBGRA
    #        Else
    #            If !GIMPORT & ORI = [M]NBLIG [M]NBLIG +=1 : Endif
    #            Call CREGRA("G",1, ORI, [M:SOH0]ORDDAT, FUNCTION, NL, RET) From TRTVENBOM
    #            If !GIMPORT & ORI = NL-1 & ORI = [M]NBLIG - 1 :[M]NBLIG-=1:Endif
    #            If GIMPORT VALEUR=[M]NBLIG Endif
    #
    #            GPOINT="CPLCREGRA" : Gosub ENTREE From EXEFNC
    #
    ## Test utilisation CPLCREGRA
    ##Local Integer NOCPS : NOCPS=NL-1
    ##Raz GBIDI1, GBIDC1
    #
    ##If [F:ITS]ITMREF <> [M:SOH4]ITMREF(NL-1)
    ##    Read [ITM]ITM0=[M:SOH4]ITMREF(NL-1)
    ##    If fstat Raz [F:ITS] : Endif
    ##Endif
    ##If [F:ITS]ITMTYP = 2 [M]LINTYP(NL-1) = 6 :ENDIF
    ##If [F:ITS]ITMTYP = 3 [M]LINTYP(NL-1) = 2 :ENDIF
    ##Call IMPCRENOM([M:SOH4]ITMREF(NL-1),NL-1,[M:SOH0]ORDDAT,2,GBIDI1,[M:SOH4]SOPLIN(NL),GBIDC1,NOCPS,GBIDI1) From TRTVENBOM
    ## Test utilisation CPLCREGRA
    #
    #            Affzo [M:SOH4]5
    #            If GIMPORT Return Endif : # Bug 72428
    #        Endif
    #    Endif
    #Endif
    #
    ## 101874 : V9 : Taxe code control
    ## Valuation depends on SOHVALLIG parameter
    ##If dim(GVALTTCSOH)>0 & dim(GVALTTC)>0 : GVALTTC=GVALTTCSOH : Endif
    #GVALTTC=GSOHVALLIG
    ##If (!GIMPORT & !(dim(GWEBSERV)=1 & GWEBSERV=1)) : Call VALTTC ("GESSOH") From TRTVENFACR : Endif
    #If (!GIMPORT & !(dim(GWEBSERV)=1 & GWEBSERV=1))
    #    #---- Paramètres complementaires appel valorisation
    #    # PARAM_T(0) : Flag contrôle des taxes             (1=Non/2=Oui)
    #    # PARAM_T(1) : Lecture de la trace par le sous-pro (1=Non/2=Oui)
    #    # PARAM_T(2) : Flag retour                         (1=KO/2=OK)
    #    Local    Char     PARAM_T (25) (0..10)
    #    PARAM_T(0)="1"      : # Pas de contrôle des taxes
    #    PARAM_T(1)="1"      : # Pas de lecture de la trace
    #    PARAM_T(2)="0"
    #    Call VALTTC ("GESSOH", PARAM_T) From TRTVENFACR
    #Endif
    ## 101874
    #
    ## Pb en import en suppression de ligne : affzo remet la variable status qui valait 65 à 1
    #If !GIMPORT Affzo [M:SOH4]10,15,20 Endif
    
    Return
    ########################################
    Subprog B2_NBLIG
    # -------- Bouton recalcul tarif -----------------
    Local Integer NOL, TYPRECH
    # --> Pas d'éxécution du bouton
    If nolign > [M]NBLIG End : Endif
    NOL=nolign-1
    #   --> Ctrl autorisation modification
    If !find (GREP, "C", "D")
        GBIDC2="M": GFCY=[M]SALFCY : Gosub AUTORIS_OPT From CONTX3
        If !GBIDI2  GZNUM=0:GERR = 1:GMESSAGE = mess(2,104,1): End : Endif
    Endif
    Call LECT_FIC(NOL) From SUBSOHB
    Call SUB_TOT(NOL)  From SUBSOHB
    If find([M]LINTYP(NOL),1,2,6,10)
        TYPRECH = 1
    Else
        Local Integer ORI : ORI=NOL
        While !find([M]LINTYP(ORI),2,6,10) & ORI >= 0 ORI-=1 Wend
        If find([M]LINTYP(ORI),2,6,10) GPNTITMREF=[M]ITMREF(ORI) Endif
        TYPRECH=4
    Endif
    Call ALICLCAMT([M:SOH4]ITMREF(NOL), [M]QTY(NOL), NOL, "SOH4", [M:SOH4]CLCAMT1(NOL), [M:SOH4]CLCAMT2(NOL)) From TRTX3
    Call RECH_TARIF(TYPRECH,[M]ITMREF(NOL),NOL,[M]QTY(NOL),"SOH",[M]GROPRI(NOL)) From TRTVENTAR
    Call CLCNETPRI([M]QTY(NOL), [M:SOH0]CUR, NOL) From TRTVENPRI
    Call CLCPFM([M]DSTOFCY(NOL), [M:SOH1]PRITYP, [M]CHGTYP, [M:SOH0]ORDDAT, [M:SOH0]CUR, NOL, 1) From TRTVENPRI
    Call APRES_LIGNE (NOL,1) From SUBSOHB
    If GREV=2 [M]LINREVNUM(NOL) = [M:SOH0]REVNUM:Endif
    [M]UPDFLG(NOL) = 1
    [M]WUPDAPPFLG(NOL) = 2
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    If [M:SOH4]DINVCND(NOL)<>"" and [M:SOH4]DINVCNDTOUPD(NOL)=[V]CST_AYES
      Gosub P1_NBLIG_DINVCND_UPD From LIBSAL_INVCND_SOH
      If mkstat=2 : GERR=1 : End : Endif
    Endif
    # End issue 107888
    Affzo [M:SOH4]5,10,15
    mkstat=4
    nolign=NOL+1
    
    End
    
    # 107890 : Scheduled invoices : (LD:18/12/15)
    ########################################
    Subprog B4_NBLIG
    
    Call B4_NBLIG From SUBSOH1
    
    End
    # 107890 : Scheduled invoices : (LD:18/12/15)
    
    # -------------------------------------- ITMREF ------------------------
    ########################################
    Subprog IB_ITMREF
    Local Integer NOL : NOL=nolign-1
    
    # Bouton   1 : Tunnel article
    # Bouton   2 : Sélection article-client
    # Bouton   3 : Visu tarif
    # Bouton   4 : Stock par site
    # Bouton   5 : Stock dispo
    # Bouton   6 : Article de remplacement
    
    # Désactivation bouton interro stock et disponible à la vente
    If [M]STOMGTCOD(NOL) = 1
       Raz GBOUT4, GBOUT5
    Endif
    # Désactivation bouton article remplacement
    If [M]ITMREF(NOL) = ""
        Raz GBOUT6
    Else
        If [F:ITM]ITMREF <> [M:SOH4]ITMREF(NOL)
            Read [F:ITM]ITM0 = [M:SOH4]ITMREF(NOL)
            If fstat  Raz [F:ITM] : Endif
        Endif
    #   --> Si ligne non normale, ou si allocation, ou si contremarque
        If [F:ITM]RPLITM = "" | [M]LINTYP(NOL) <> 1 | sum([M]TALLQTY(NOL),[M]SHTQTY(NOL),[M]LPRQTY(NOL))  <> 0 |
    &      [M]FMINUM(NOL) <> ""
            Raz GBOUT6
        Endif
    Endif
    
    End
    ######################################################################################
    ## Etiquette ajoutée par le superviseur (écran SOH4) 09/11/2004 17:18:20 (LD)
    ######################################################################################
    Subprog AV_ITMREF(VALEUR)
    Variable Char    VALEUR()
    If VALEUR="" | nolign>[M]NBLIG End Endif
    Gosub COLOR_KIT
    End
    ########################################
    Subprog AS_ITMREF(VALEUR)    : # --- Web - Obligatoire - Synchrone
    Variable Char    VALEUR()
    If GMODIF <> 2 mkstat=2 Endif
    End
    ########################################
    Subprog C_ITMREF(VALEUR)
    Variable Char    VALEUR()
    Local    Integer NOL    : NOL = nolign-1
    Local    Integer RET, OK, I
    Local    Char    REP
    # ------------------------------------------------------------------------------------ #
    # Penser à mettre en phase Gestion articles de remplacement (TRT_RPLITM de SUBSOHB)    #
    #                          Inter-societe                    (C_ITMREF   de TRTVENISOC) #
    # ------------------------------------------------------------------------------------ #
    # --> Etape n°1 : Remplacement par article de substitution
    Call CTLSBSITM(VALEUR, [M:SOH0]ORDDAT, RET) From TRTVENCTL
    If RET = 1
        GMESSAGE = mess(40,192,1) : mkstat=2 : End
    Elsif RET = 2
        VALEUR = [F:ITS]ITMREF
        GMESSAGE = mess(10,191,1) - VALEUR : GERR=2
    Endif
    # --> Etape n°2 : Lecture article
    If [F:ITM]ITMREF <> VALEUR
        Read [ITM]ITM0=VALEUR
        If fstat GMESSAGE = mess(8,192,1) : mkstat=2 : End : Endif
    Endif
    # --> Etape n°3 : Ctrl du statut de l'article : Ctrl statut non utilisable
    #     Les autres statuts dépendent du code FMI, il sont ctrlés en AM_ITMREF
    
    #If [F:ITM]ITMSTA = 6
    #   If GERR = 2 GMESSAGE += " \ " Endif
    #   GMESSAGE += mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")"
    #   mkstat=2 : End
    #Endif
    
    # Issue X3-237901 - 2021-04-14 by ADSHO : Enhance messages for Product status with status Prototype
    If func AFNC.ACTIV("NPI") > 0
        If [F:ITM]ITMSTA = 6 or ([F:ITM]ITMSTA = 2 and [F:ITM]NPIPRO = 2)
           If GERR = 2
              GMESSAGE += " \ "
           Endif
    
           If [F:ITM]ITMSTA = 2 and [F:ITM]NPIPRO = 2
              GMESSAGE += mess(3,196,1) + " (" + mess([F:ITM]ITMSTA,246,1) + " - " + mess(1226,196,1) + ")"
           Else
              GMESSAGE += mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")"
           Endif
    
           mkstat=2
           End
        Endif
    Else
        If [F:ITM]ITMSTA = 6
           If GERR = 2
              GMESSAGE += " \ "
           Endif
    
           GMESSAGE += mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")"
           mkstat=2
           End
        Endif
    Endif
    # End issue X3-237901
    
    # On vérifie que la date de commande est bien >= la date de début de vie de l'article
    If [F:ITM]LIFSTRDAT<>[0/0/0] & [M:SOH0]ORDDAT<[F:ITM]LIFSTRDAT
       mkstat=2 : GMESSAGE=mess(331,199,1)-":"-format$(GFMDAT,[F:ITM]LIFSTRDAT) : End
    Endif
    # On vérifie que l'article est toujours vendu
    If clalev([F:ITG])= 0 Local File ITMCATEG [ITG] : Endif
    If [F:ITG]TCLCOD <> [F:ITM]TCLCOD
        Read [ITG]ITG1=[F:ITM]TCLCOD;""
        If fstat GMESSAGE = [F:ITM]TCLCOD-":"-mess(338,199,1) : mkstat=2 : End : Endif
    Endif
    If [F:ITG]SALFLG<>2 GMESSAGE = mess(221,199,1)-"("-[F:ITM]TCLCOD-")" : mkstat=2 : End : Endif
    
    # 107890 : Scheduled invoices : (LD:08/12/15)
    If [M:SOH0]SOHCAT=2
        # Undeliverable item are not authorized for loan order
        If [F:ITM]DLVFLG<>2
            GMESSAGE=mess(647,199,1) : mkstat=2 : End
        Endif
    # 107890 : Scheduled invoices Step 1 : (LD:09/12/15)
    Elsif [M:SOH0]SOHCAT=1
        # Undeliverable Kit are not authorized for normal order
        # Issue 107888 - 2016-09-09 by CPO : US155 Kit & flexible kit scheduled invoices
        #If [F:ITM]DLVFLG<>2 & find([F:ITS]ITMTYP, 2,3)
        #    GMESSAGE=mess(647,199,1) : mkstat=2 : End
        #Endif
        If [F:ITM]DLVFLG<>2
          If    [F:ITS]ITMTYP = 3 # Undeliverable kit are not allowed
            GMESSAGE=mess(647,199,1) : mkstat=2 : End
          Elsif [F:ITS]ITMTYP = 2 # Flexible kits are allowed
            #TODO
          Endif
        Endif
    Endif
    # 107890 : Scheduled invoices : (LD:08/12/15)
    # 107890 : Scheduled invoices : (LC:09/01/17) (US X3 16900)
    If [M:SOH1]BETFCY = 2 & [M:SOH1]BETCPY <> 2
     If [F:ITM]DLVFLG <> 2 : GMESSAGE=mess(545,192,1) : mkstat = 2 : End : Endif # non livrable
    Endif
    
    # --> Etape n°4 : Recherche interdit
    If dim([M]REP1(NOL)) > 0 REP = [M]REP1(NOL):Endif
    Call RECH_INTERDIT (VALEUR, [M]DBPAADD(NOL), REP, 2) From TRTVENTAR
    If mkstat = 2 End : Endif
    
    # --> Etape n°5 : Controle article-site
    #Call CONTITF(VALEUR,[M:SOH4]DSTOFCY(NOL),[F:ITM]STOMGTCOD, "O") From TRTVENCTL
    #If mkstat = 2 : End : Endif
    
    # --> Etape n°5 : Si cde de prêt, l'article doit etre géré en pret
    If [M:SOH0]SOHCAT = 2 & [F:ITS]LNDFLG = 1
        GMESSAGE=mess(34,192,1) : mkstat=2 : End
    Endif
    # --> Etape n°5 : Si cde de prêt et article géré en stock, il doit être géré en emplacement
    If [M:SOH0]SOHCAT = 2 & [F:ITM]STOMGTCOD <> 1
       If [F:ITF]ITMREF <> VALEUR | [F:ITF]STOFCY <> [M:SOH4]DSTOFCY(NOL)
           Read [ITF] ITF0=[F:ITM]ITMREF;[M:SOH4]DSTOFCY(NOL)
           If fstat Raz [F:ITF] : Endif
       Endif
       If [F:ITF]STOMGTCOD>1 & [F:ITF]LOCMGTCOD <> 2
          GMESSAGE = mess(119,192,1) : mkstat = 2 : End
       Endif
    Endif
    # --> Etape n°6 : Si cde inter-site : Ctrl existence article-site sur le site de réception
    #                (Pour la maj stock en transit à la sortie des stocks)
    #If [M:SOH1]BETFCY=2 & [M:SDH1]PRHFCY<>""
    #    Call CONTITF(VALEUR, [M:SDH1]PRHFCY, [F:ITM]STOMGTCOD) From TRTVENCTL
    #    If mkstat=2 GMESSAGE = mess(54,198,1)-mess(350,198,1)-":"-mess(293,192,1)-[M:SDH1]PRHFCY : End Endif
    #Endif
    
    # X3-85706 (LCC 13-04-18) Error message when we try to validate a delivery - ITMFACILIT [IFF1] Key..no current records
    If !clalev([BPD]): Local File BPDLVCUST: Endif
    Read [F:BPD]BPD0 = [M:SOH0]BPCORD;[M:SOH4]DBPAADD(NOL) : If fstat Raz [BPD] Endif
    If [M:SOH1]BETFCY=2 & [F:BPD]RCPFCY<>"" & [M:SOH0]SOHCAT<>3
        If [F:ITM]RCPFLG=2
            Call CONTITF(VALEUR, [F:BPD]RCPFCY, [F:ITM]STOMGTCOD) From TRTVENCTL
            If mkstat=2 GMESSAGE = mess(74,187,1)-":"-mess(293,192,1)-[F:BPD]RCPFCY : End Endif
        Endif
    Endif
    # End X3-85706 (LCC 13-04-18) Error message when we try to validate a delivery - ITMFACILIT [IFF1] Key..no current records
    
    # --> Etape n°6 : Si cde à facturation directe inter-site, l'article ne doit pas être réceptionné
    # Issue 113089/130 - 2016-10-14 by SR : Message 269,194 remplacé par 578,194
    If [M:SOH0]SOHCAT=3 & [M:SOH1]BETFCY=2
        If [F:ITM]RCPFLG=2 GMESSAGE=mess(98,197,1)-mess(3,446,1)-mess(578,194,1) : mkstat=2 : End : Endif
    Endif
    
    # Bug 82658 : Recherche tarif si changement de référence article
    # Erreur suite à la recherche tarif effectuée en AM_
    If dim(GERRITMREF)>0 & GERRITMREF=2
      # Si on resaisit l'article initial
      # --> Il faut redéclencher l'AM_ pour recharger les champs avec l'article initial
      If VALEUR=[M]ITMREF(NOL) Call AM_ITMREF(VALEUR) Endif
    Endif
    # Bug 82658
      # FGR 10/04/2015 : X3SUIVI105605 (début)
      If VALEUR <> [M:SOH4]ITMREF(NOL) Then
        If dim([M:SOH4]ECCVALMAJ) > 0 Then
          Raz [M:SOH4]ECCVALMAJ(NOL)
          Raz [M:SOH4]ECCVALMIN(NOL)
        Endif
      Endif
      # FGR 10/04/2015 : X3SUIVI105605 (fin)
    End
    ########################################
    Subprog AM_ITMREF(VALEUR)    : # --- Web - Obligatoire - Synchrone
    Variable Char    VALEUR()
    Local    Integer NOL    : NOL = nolign-1
    
    # --------------------------------------------------------------------------------- #
    # Penser à mettre en phase gestion articles de remplacement (TRT_RPLITM de SUBSOHB) #
    # --------------------------------------------------------------------------------- #
    # Si utilisation du bouton article de remplacement
    
    # Bug 82658 : Redéclenchement volontaire de l'AM_
    # suite à la recherche tarif avec erreur et resaisit de l'article initial
    #If VALEUR = [M]ITMREF(NOL) & !GIMPORT End Endif
    If VALEUR = [M]ITMREF(NOL) & !GIMPORT & (dim(GERRITMREF)<0 | GERRITMREF<>2 )
        End
    Endif
    If dim(GERRITMREF)>0 Kill GERRITMREF Endif
    # Bug 82658
    
    # --> Etape n°6 : Init des zones
    #--------------------------------------------------------------------------#
    # Si retour par Shift-Tab ou click souris sur ligne en cours de création : #
    # Effacement de la quantité commandée pour forcer la recherche tarif       #
    # Effacement des sections analytiques pour réactiver l'INISEC              #
    #--------------------------------------------------------------------------#
    #MAE, le 14/04/08, pas de Raz de la quantité si on vient des articles commandés
    If GPILNAV > 1
        If find (GNAVIG(GPILNAV -1),"VISUITM")
            Raz [M]QTY(NOL)
        Endif
    Endif
    
    # A cause de l'INISEC "SOP" qui peut être paramétré avec [F:POP]
    If GMODU(6)=2 & GOPTCANA>0 & dim([F:POP]POHNUM)>0 : Raz [F:POP] : Endif
    #If dim([M]CCE1(NOL))>0 Raz [M]CCE1(NOL) : Endif
    #If dim([M]CCE2(NOL))>0 Raz [M]CCE2(NOL) : Endif
    #If dim([M]CCE3(NOL))>0 Raz [M]CCE3(NOL) : Endif
    #If dim([M]CCE4(NOL))>0 Raz [M]CCE4(NOL) : Endif
    #If dim([M]CCE5(NOL))>0 Raz [M]CCE5(NOL) : Endif
    #If dim([M]CCE6(NOL))>0 Raz [M]CCE6(NOL) : Endif
    #If dim([M]CCE7(NOL))>0 Raz [M]CCE7(NOL) : Endif
    #If dim([M]CCE8(NOL))>0 Raz [M]CCE8(NOL) : Endif
    #If dim([M]CCE9(NOL))>0 Raz [M]CCE9(NOL) : Endif
    
    [M]GRPFLG(NOL) = 1
    [M]LINTYP(NOL) = 1
    [M]FOCFLG(NOL) = 1
    If [F:ITS]ITMTYP = 2 [M]LINTYP(NOL) = 6 :Endif
    If [F:ITS]ITMTYP = 3 [M]LINTYP(NOL) = 2 :Endif
    
    Call INIT_ITM (NOL, VALEUR) From SUBSOHB
    
    # -------------------------------------------- #
    # --> Etape n°7 :     Gestion du FMI           #
    # -------------------------------------------- #
    Local Integer WFMI, WOK : WOK=2
    
    Call ALIFMI(VALEUR, [M:SOH4]DSTOFCY(NOL), WFMI) From TRTVENCDE
    Case WFMI
        When 1 : # Stock
            # Issue X3-237901 - 2021-04-14 by ADSHO : Enhance messages for Product status with status Prototype
    #        If [F:ITM]ITMSTA>1
    #            Call AVERTIR (VALEUR-":"-mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")", WOK) From GESECRAN
    #            If WOK=1 mkstat=2 : End Endif
    #        Endif
            If func AFNC.ACTIV("NPI") > 0
                If [F:ITM]ITMSTA > 1 and [F:ITM]NPIPRO <> 2
                    Call AVERTIR (VALEUR-":"-mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")", WOK) From GESECRAN
                    If WOK=1
                        mkstat=2
                        End
                    Endif
                Endif
            Else
                If [F:ITM]ITMSTA>1
                    Call AVERTIR (VALEUR-":"-mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")", WOK) From GESECRAN
                    If WOK=1
                        mkstat=2
                        End
                    Endif
                Endif
            Endif
            # End issue X3-237901
        When 3 : # Contremarque achat
            If [F:ITM]ITMSTA=3
                Call AVERTIR (VALEUR-":"-mess(281,197,1)-":\"-mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")", WOK) From GESECRAN
                If WOK=1 mkstat=2 : End Endif
            Elsif [F:ITM]ITMSTA>1
                GMESSAGE=VALEUR-":"-mess(281,197,1)-":\"-mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")" : mkstat=2 : End
            Endif
        When 5 : # Contremarque production
            Call CONTMFGITM([M]DSTOFCY(NOL), 1) From MFGLIB : If mkstat=2 End Endif
    Endcase
    
    [M:SOH4]FMI(NOL)=WFMI
    
    # Bug 82658 : Recherche tarif si changement de référence article
    # Si ce n'est pas un gratuit et qté non nulle
    If [M]QTY(NOL)<>0 & [M]FOCFLG(NOL) <> 3
        # --> Calcul des montants de base calcul de taxe
        Call ALICLCAMT(VALEUR, [M:SOH4]QTY(NOL), NOL, "SOH4", [M:SOH4]CLCAMT1(NOL), [M:SOH4]CLCAMT2(NOL)) From TRTX3
        # --------------- Recherche tarif -----------------
        Local Integer TYP
        Local Char    WSVG_ITMREF(GLONITM)
        # Article normal ou composé
        TYP=1
        # Composant
        If find([M:SOH4]LINTYP(NOL),3,4,5,7,8,9,11,12,13)
            Local Integer ORI : ORI=NOL
            While !find([M]LINTYP(ORI),2,6,10) & ORI >= 0 ORI-=1 Wend
            If find([M]LINTYP(ORI),2,6,10) GPNTITMREF=[M]ITMREF(ORI) Endif
            TYP=4
        Endif
        # --> Recherche tarif
        Call RECH_TARIF(TYP,VALEUR,NOL,[M]QTY(NOL),"SOH",[M]GROPRI(NOL)) From TRTVENTAR
        # --> Calcul du prix net
        Call CLCNETPRI([M]QTY(NOL), [M:SOH0]CUR, NOL) From TRTVENPRI
        # Le ctrl du prix net et le calcul de marge utilise la classe [M]
        WSVG_ITMREF=[M]ITMREF(NOL) : [M]ITMREF(NOL)=VALEUR
        # Issue X3-200515/X3-208171 - 2020-09-08 by SR : Progress billing
        #If GDACLOK = 1
        If GDACLOK = 1 | (dim([M:SOH4]PRGBILNUM) > 1 & [M:SOH4]PRGBILNUM(NOL) <> "")
            Call CTLNETPRI([M:SOH0]BPCORD,[M:SOH0]CHGTYP,[M:SOH0]ORDDAT,[M:SOH0]CUR,NOL) From TRTVENPRI
            If mkstat=2
              [M]ITMREF(NOL)=WSVG_ITMREF
              # Déclaration d'une globale signalant l'erreur sur le champ, globale testée en C_
              If dim(GERRITMREF)<0 Global Integer GERRITMREF : GERRITMREF=2 Endif
              End
            Endif
        Endif
        # --> Calcul de la marge
        Call CLCPFM([M]DSTOFCY(NOL), [M:SOH1]PRITYP, [M]CHGTYP, [M:SOH0]ORDDAT, [M:SOH0]CUR, NOL, 2) From TRTVENPRI
        If GDACLOK = 1
            Call CTLPFM([M:SOH0]CUR,[M:SOH4]CPRPRI(NOL), NOL) From TRTVENPRI
            If mkstat=2
              [M]ITMREF(NOL)=WSVG_ITMREF
              # Déclaration d'une globale signalant l'erreur sur le champ, globale testée en C_
              If dim(GERRITMREF)<0 Global Integer GERRITMREF : GERRITMREF=2 Endif
              End
            Endif
        Endif
        Gosub AFF_RECH_TAR
        Affzo [M:SOH4]CPRPRI(NOL)
        Affzo [M:SOH4]PFM(NOL)
    Endif
    # Bug 82658
    
    If !(dim(GWEBSERV)=1 & GWEBSERV=1)
        Affzo [M:SOH4]DSTOFCY(NOL)
        Affzo [M:SOH4]ITMDES(NOL),ITMDES1(NOL), SAU(NOL), SAUSTUCOE(NOL), STU(NOL), LINTYP(NOL),FOCFLG(NOL)
        Affzo [M:SOH4]VACITM1(NOL),VACITM2(NOL),VACITM3(NOL)
        Affzo [M:SOH4]PCK(NOL),PCKCAP(NOL),DEMSTA(NOL)
        Affzo [M:SOH4]PRECOD(NOL)
    
        If find([M]FMI(NOL),3,5) [M]DALLTYP(NOL)=2 Endif
        Affzo [M:SOH4]FMI(NOL)
    Endif
    
    If [M:SOH4]DACSAUCOE(NOL) < 2
        Diszo [M:SOH4]SAUSTUCOE(NOL)
    Else
        Actzo [M:SOH4]SAUSTUCOE(NOL)
    Endif
    
    #      Si import des composants : le type de ligne doit etre garni dans [M]
    #      notamment pour la recherche des tarifs composants
    If GIMPORT & (dim(G_LINTYP)>0 & G_LINTYP=1)
       If find([F:SOP]LINTYP,3,4,5,7,8,9,11,12,13) : [M]LINTYP(NOL)=[F:SOP]LINTYP : Endif
    Endif
    
    ##      Si import des gratuits : le flag gratuit doit etre garni dans [M]
    If GIMPORT & (dim(G_FOCFLG)>0 & G_FOCFLG=1)
        # Garnissage du flag gratuit dans [M]
        If find([F:SOP]FOCFLG, 1,2,3) [M]FOCFLG(NOL)=[F:SOP]FOCFLG Else [M]FOCFLG(NOL)=1 Endif
        # Sur la ligne du gratuit il faut rechercher l'article origine
        If [M]FOCFLG(NOL)=3 and NOL>0 # Issue 112809 - 2016-01-25 by CPO : added "and NOL>0" Imported free item on first order line
            Local Integer WNOLCPE : WNOLCPE=NOL-1
            If WNOLCPE>=0 & !find([M]LINTYP(WNOLCPE),1,2,6,10)
                While !find([M]LINTYP(WNOLCPE),1,2,6,10) & WNOLCPE >= 0
                    WNOLCPE-=1
                Wend
            Endif
            If WNOLCPE>=0 # Issue 112809 - 2016-01-25 by CPO : "ceinture-bretelles" (si 2 et plus premières lignes de gratuits...)
              [M]ORILIN(NOL)=[M]SOPLIN(WNOLCPE)
            Endif
        Endif
    Endif
    
    
    # V6 Règle affectation
    If dim([M:SOH4]PTOCOD)>0
       [M:SOH4]PTOCOD(NOL) = func ITMLIB.GET_PTOCOD(VALEUR,[M:SOH4]DSTOFCY(NOL))
    Endif
    
    End
    
    # -------------------------------------- ITMDES ------------------------
    ########################################
    Subprog IB_ITMDES
    Global   Char    GITMREF
    # Alimentation GITMREF pour appel GOBJETC
    GITMREF=[M]ITMREF(nolign-1)
    Call IB_NOTECHECK([M:SOH4]ITMREF(nolign-1),"ITMREF",2)  From TRTNTSCTL # product notes EWI 86290
    Call IB_PRDINF([M:SOH4]ITMREF(nolign-1),3) From PRDINFLIB  # DF 79831 EWI 86290
    End
    
    # -------------------------------------- ITMDES1 -----------------------
    ########################################
    Subprog IB_ITMDES1
    Global   Char    GITMREF
    # Alimentation GITMREF pour appel GOBJETC
    GITMREF=[M]ITMREF(nolign-1)
    End
    
    # -------------------------------------- DSTOFCY ------------------------
    ########################################
    Subprog IB_DSTOFCY
    # Activation du bouton article-site
    If [M:SOH4]STOMGTCOD(nolign-1) = 1
        Raz GBOUT1, GBOUT3
    Else
        GBOUT1=mess(4,198,1)
    Endif
    End
    ########################################
    Subprog AS_DSTOFCY(VALEUR)    : # --- Web - Obligatoire - Synchrone
    Variable Char    VALEUR()
    Local    Integer NOL : NOL = nolign-1
    
    # --> Zone non modifiable si il y a des allocations
    #If sum([M]ALLQTY(NOL),[M]SHTQTY(NOL),[M]ODLQTY(NOL),[M]DLVQTY(NOL),[M]INVQTY(NOL)) <> 0
    If ([M]TALLQTY(NOL)+[M]SHTQTY(NOL)+[M]LPRQTY(NOL))<>0 mkstat = 2 : End : Endif
    # --> Zone non modifiable si la contremarque a été générée
    If [M]FMINUM(NOL) <> "" mkstat = 2 : End : Endif
    # --> Zone non modifiable si livraison commande complète
    If [M:SOH2]DME = 3  mkstat = 2 : End : Endif
    End
    ########################################
    Subprog AM_DSTOFCY(VALEUR)    : # --- Web - Faible - Asynchrone
    Variable Char    VALEUR()
    Local    Integer NOL : NOL=nolign-1
    Local    Integer WFMI, WOK, WI : WOK=1
    Local    Integer WSTOMGTCOD
    Local    Char    WTSCCOD(GLONADI) (0..5)
    Local    Char    WTSICOD(GLONADI) (0..5)
    
    WSTOMGTCOD=[M:SOH4]STOMGTCOD(NOL)
    # Si modification du site, il faut recharger STOMGTCOD
    If [F:ITM]ITMREF <> [M:SOH4]ITMREF(NOL)
        Read [ITM]ITM0=[M:SOH4]ITMREF(NOL)
        If fstat Raz [F:ITM] Endif
    Endif
    [M:SOH4]STOMGTCOD(NOL) = [F:ITM]STOMGTCOD
    If [F:ITM]STOMGTCOD>1
        Call CONTITF([M:SOH4]ITMREF(NOL),VALEUR,[F:ITM]STOMGTCOD) From TRTVENCTL
        If mkstat=2 GERR=1 : End : Endif
        [M:SOH4]STOMGTCOD(NOL) = [F:ITF]STOMGTCOD
    Endif
    [M:SOH4]YSTOMGTCOD(NOL) = [M:SOH4]STOMGTCOD(NOL) : # Bug 55476
    # L'article devient non géré en stock, il faudra supprimer l'encours
    If WSTOMGTCOD<>[M:SOH4]STOMGTCOD(NOL) & [M:SOH4]STOMGTCOD(NOL)=1 [M]WIPFLG(NOL) = "A"
    Elsif [M]WIPFLG(NOL) = "" [M]WIPFLG(NOL) = "M" Endif
    
    Call ALIFMI([M]ITMREF(NOL), VALEUR, WFMI) From TRTVENCDE
    If WFMI <> [M]FMI(NOL)
        Case WFMI
            When 1 : # Stock
                If [F:ITM]ITMSTA>1
                    Call AVERTIR (mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")", WOK) From GESECRAN
                    If WOK=1 mkstat=2 : End Endif
                Endif
            When 3 : # Contremarque achat
                If [F:ITM]ITMSTA=3
                    Call AVERTIR (mess(281,197,1)-":\"-mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")", WOK) From GESECRAN
                    If WOK=1 mkstat=2 : End Endif
                Elsif [F:ITM]ITMSTA>1
                    GMESSAGE=mess(281,197,1)-":\"-mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")" : mkstat=2 : End
                Endif
            When 5 : # Contremarque production
                Call CONTMFGITM([M]DSTOFCY(NOL), 1) From MFGLIB : If mkstat=2 End Endif
        Endcase
        [M:SOH4]FMI(NOL)=WFMI
        If find([M:SOH4]FMI(NOL),3,5) [M:SOH4]DALLTYP(NOL)=2 Endif
    Endif
    # Si modification du site, réinitialisation du code prépa
    If dim([M:SOH0]TSCCOD) <> -1
        For WI = 1 To dim([M:SOH0]TSCCOD)
            WTSCCOD(WI-1) = [M:SOH0]TSCCOD(WI-1)
        #--CPO 90371 Lors de la correction de cette fiche - ici on fait For WI et Next I
        #Next I
        Next WI
        #--/
    Endif
    If dim([M:SOH4]TSICOD1)>0: WTSICOD(0) = [M:SOH4]TSICOD1(NOL): Endif
    If dim([M:SOH4]TSICOD2)>0: WTSICOD(1) = [M:SOH4]TSICOD2(NOL): Endif
    If dim([M:SOH4]TSICOD3)>0: WTSICOD(2) = [M:SOH4]TSICOD3(NOL): Endif
    If dim([M:SOH4]TSICOD4)>0: WTSICOD(3) = [M:SOH4]TSICOD4(NOL): Endif
    If dim([M:SOH4]TSICOD5)>0: WTSICOD(4) = [M:SOH4]TSICOD5(NOL): Endif
    If [F:BPC]BPCNUM<>[M:SOH0]BPCORD
       Read [BPC]BPC0=[M:SOH0]BPCORD : If fstat Raz [F:BPC] Endif
    Endif
    Call REC_PRECOD(VALEUR,[M:SOH4]ITMREF(NOL),[F:ITM]TCLCOD,WTSICOD(0),
    &               WTSICOD(1),WTSICOD(2),WTSICOD(3),WTSICOD(4),[M:SOH0]BPCORD,
    &               [F:BPC]BCGCOD,WTSCCOD(0),WTSCCOD(1),WTSCCOD(2),WTSCCOD(3),
    &               WTSCCOD(4),[M:SOH4]PRECOD(NOL)) From STKLIB
    Affzo [M:SOH4]PRECOD(NOL)
    
    # V6 Règle affectation
    If dim([M:SOH4]PTOCOD)>0
       [M:SOH4]PTOCOD(NOL) = func ITMLIB.GET_PTOCOD([M:SOH4]ITMREF(NOL), VALEUR)
    Endif
    
    # Issue X3-66385
    If [M]UPDFLG(NOL)<>0 | [M]CREFLG(NOL)<>0 End Endif
    # Réinitialisation de l'emballage uniquement en saisie de la ligne
    # Package reinitialization only when the line is being fed
    
    If [F:ITU]ITMREF <> [M:SOH4]ITMREF(NOL) | [F:ITU]BPCNUM <> [M:SOH0]BPCORD
        Read [ITU] ITU0=[M:SOH4]ITMREF(NOL);[M:SOH0]BPCORD
        If fstat Raz [F:ITU] Endif
    Endif
    
    # L'emballage est initialisé en priorité avec l'article client
    # Il est initialisé avec l'article (article site ou catégorie article) uniquement si l'UV de l'article = l'UV de la ligne
    # et si l'UV de l'article client = l'UV de la ligne mais il n'y a pas d'emballage pour l'article client
    # ou si l'UV de l'article client est différente de l'UV de la ligne
    # Package is initialized in priority with product customer
    # It is initialized  with product (product site or product category) only if UV product= UV line
    # and if UV product customer = UV line but there is no package for product customer
    # or  if UV product customer <> UV line
    If [M:SOH4]SAU(NOL) = [F:ITM]SAU & ([F:ITU]PCK = "" | [M:SOH4]SAU(NOL) <> [F:ITU]SAU)
        Call ALIPCK ([M:SOH4]ITMREF(NOL), VALEUR, [M:SOH4]PCK(NOL), [M:SOH4]PCKCAP(NOL)) From TRTVENDIV
        Affzo [M:SOH4]PCK(NOL)
        Affzo [M:SOH4]PCKCAP(NOL)
    Endif
    # End issue X3-66385
    
    
    End
    # -------------------------------------- SAU ------------------------
    ########################################
    Subprog AS_SAU(VALEUR)    : # --- Web - Obligatoire - Synchrone
    Variable Char    VALEUR()
    If GMODIF <> 2 | [M]LINTYP(nolign-1) <> 1 mkstat=2 : Endif
    
    #LSE 05/12/2006 FQ38520
    Local Integer NOL : NOL=nolign-1
    If [F:ITM]ITMREF <> [M:SOH4]ITMREF(NOL)
        Read [ITM]ITM0=[M:SOH4]ITMREF(NOL)
        If fstat Raz [F:ITM] Endif
    Endif
    If [F:ITM]HDKITMTYP=5
        mkstat=2
    Endif
    
    End
    ########################################
    Subprog AM_SAU(VALEUR)    : # --- Web - Obligatoire - Synchrone
    Variable Char    VALEUR()
    Local Integer NOL : NOL=nolign-1
    
    [M:SOH4]QTY(NOL) = 0
    [M:SOH4]QTYSTU(NOL) = 0
    # Raz de l'emballage et sa capacité, si l'unité de commande n'est plus l'UV article ou article-client
    If [F:ITU]ITMREF <> [M:SOH4]ITMREF(NOL) | [F:ITU]BPCNUM <> [M:SOH0]BPCORD
       Read [ITU] ITU0=[M:SOH4]ITMREF(NOL);[M:SOH0]BPCORD
       If fstat Raz [F:ITU] Endif
    Endif
    
    # Issue X3-66385
    #If VALEUR <> [F:ITU]SAU
    #    If [F:ITM]ITMREF <> [M:SOH4]ITMREF(NOL)
    #       Read [ITM]ITM0=[M:SOH4]ITMREF(NOL)
    #       If fstat Raz [F:ITM] Endif
    #    Endif
    #    If VALEUR <> [F:ITM]SAU
    #        Raz [M:SOH4]PCK(NOL), [M:SOH4]PCKCAP(NOL)
    #    Else
    ##       L'unité de commande est l'UV article    : On réinitialise l'emballage
    #
    ##        If [F:ITS]ITMREF <> [M:SOH4]ITMREF(NOL)
    ##           Read [ITS]ITS0=[M:SOH4]ITMREF(NOL)
    ##           If fstat Raz [F:ITS] Endif
    ##        Endif
    #
    #       Call ALIPCK ([M:SOH4]ITMREF(NOL), [M:SOH4]DSTOFCY(NOL), [M:SOH4]PCK(NOL), [M:SOH4]PCKCAP(NOL)) From TRTVENDIV
    #    Endif
    #Else
    ##   L'unité de commande est l'UV article-client : On réinitialise l'emballage
    #    [M:SOH4]PCK(NOL)        = [F:ITU]PCK
    #    [M:SOH4]PCKCAP(NOL)     = [F:ITU]PCKCAP
    #Endif
    
    If [F:ITM]ITMREF <> [M:SOH4]ITMREF(NOL)
       Read [ITM]ITM0=[M:SOH4]ITMREF(NOL)
       If fstat Raz [F:ITM] Endif
    Endif
    Raz [M:SOH4]PCK(NOL), [M:SOH4]PCKCAP(NOL)
    # L'emballage est initialisé en priorité avec l'article client
    # Il est initialisé avec l'article (article site ou catégorie article) uniquement si l'UV de l'article = l'UV de la ligne
    # et si l'UV de l'article client = l'UV de la ligne mais il n'y a pas d'emballage pour l'article client
    # ou si l'UV de l'article client est différente de l'UV de la ligne
    # Package is initialized in priority with product customer
    # It is initialized  with product (product site or product category) onky if UV product= UV line
    # and if UV product customer = UV line but there is no package for product customer
    # or  if UV product customer <> UV line
    If VALEUR = [F:ITU]SAU
    #   L'unité de commande est l'UV article-client : On réinitialise l'emballage
        [M:SOH4]PCK(NOL)        = [F:ITU]PCK
        [M:SOH4]PCKCAP(NOL)     = [F:ITU]PCKCAP
    Endif
    If [M:SOH4]PCK(NOL) = ""
        If VALEUR = [F:ITM]SAU
          Call ALIPCK ([M:SOH4]ITMREF(NOL), [M:SOH4]DSTOFCY(NOL), [M:SOH4]PCK(NOL), [M:SOH4]PCKCAP(NOL)) From TRTVENDIV
        Endif
    Endif
    # End issue X3-66385
    
    Affzo [M:SOH4]SAUSTUCOE(NOL), PCK(NOL), PCKCAP(NOL)
    If [M:SOH4]DACSAUCOE(NOL) < 2
        Diszo [M:SOH4]SAUSTUCOE(NOL)
    Else
        Actzo [M:SOH4]SAUSTUCOE(NOL)
    Endif
    End
    # -------------------------------------- SAUSTUCOE ------------------------
    ########################################
    Subprog AS_SAUSTUCOE(VALEUR)
    Variable Decimal VALEUR
    
    If GMODIF<>2 | [M]LINTYP(nolign-1)<>1 | [M]SAU(nolign-1)=[M]STU(nolign-1)
        mkstat=2
    Endif
    End
    ##########################################################################
    ## Etiquette ajoutée par le superviseur 16/07/2003 08:21:53 (LD)
    ##########################################################################
    Subprog AM_SAUSTUCOE(VALEUR)
    Variable Decimal VALEUR
    
    Local    Integer  NOL     : NOL=nolign-1
    Local    Shortint TYP
    Local    Decimal  WANC_SAUSTUCOE, WANC_QTYSTU
    
    WANC_QTYSTU=[M]QTYSTU(NOL)
    Call CNVQTY([M]QTY(NOL),VALEUR,[M]STU(NOL),[M]QTYSTU(NOL)) From TRTVENQTE
    
    # Si la modification du coef a modifié la qté cdée, Init de la qté à allouer selon paramètre :
    # Si Init de la qté à allouer à oui et
    # Si Pas de gestion des signatures Ou (Allocation et encours article cdes non signées à oui Ou commande signée)
    #85683 : Init qté à allouer à tord
    #Fq72189-Gbn-GAPPSOH=1 remplacé par GAPPSOH<>2
    #If GINIALLORD=2 & WANC_QTYSTU<>[M]QTYSTU(NOL) & (GAPPSOH<>2 | ((GSOHAPPORD=2 & GSOHAPPALL=2) | [M:SOH1]APPFLG>2))
    If GINIALLORD=2 & WANC_QTYSTU<>[M]QTYSTU(NOL) & (GAPPSOH<2 | ((GSOHAPPORD=2 & GSOHAPPALL=2) | [M:SOH1]APPFLG>2))
    #85683
        Local Decimal WSAUSTUCOE : WSAUSTUCOE=VALEUR
        Gosub INIT_WALLQTYSTU From SUBSOH1
    Endif
    
    # La modif. du coef de conversion UV_US entraîne une nvelle recherche tarif (utile si tarif en US)
    # Pas de recherche tarif pour les gratuits
    If [M:SOH4]FOCFLG(NOL) = 3 End : Endif
    # ----- Recherche tarif -------
    # Article normal ou composé
    TYP=1
    # Composant
    If find([M:SOH4]LINTYP(NOL),3,4,5,7,8,9,11,12,13) TYP=4 Endif
    # --> Recherche tarif
    WANC_SAUSTUCOE=[M]SAUSTUCOE(NOL)
    [M]SAUSTUCOE(NOL)=VALEUR
    Call RECH_TARIF(TYP,[M]ITMREF(NOL),NOL,[M]QTY(NOL),"SOH",[M]GROPRI(NOL)) From TRTVENTAR
    # --> Calcul du prix net
    Call CLCNETPRI([M]QTY(NOL), [M:SOH0]CUR, NOL) From TRTVENPRI
    # Issue X3-200515/X3-208171 - 2020-09-08 by SR : Progress billing
    #If GDACLOK = 1
    If GDACLOK = 1 | (dim([M:SOH4]PRGBILNUM) > 1 & [M:SOH4]PRGBILNUM(NOL) <> "")
        Call CTLNETPRI([M:SOH0]BPCORD,[M:SOH0]CHGTYP,[M:SOH0]ORDDAT,[M:SOH0]CUR,NOL) From TRTVENPRI
        If mkstat=2 [M]SAUSTUCOE(NOL)=WANC_SAUSTUCOE : End : Endif
    Endif
    # --> Calcul de la marge
    Call CLCPFM([M]DSTOFCY(NOL), [M]PRITYP, [M]CHGTYP, [M:SOH0]ORDDAT, [M:SOH0]CUR, NOL, 2) From TRTVENPRI
    If GDACLOK = 1
        Call CTLPFM([M:SOH0]CUR,[M:SOH4]CPRPRI(NOL), NOL) From TRTVENPRI
        If mkstat=2 [M]SAUSTUCOE(NOL)=WANC_SAUSTUCOE : End : Endif
    Endif
    Gosub AFF_RECH_TAR
    Affzo [M:SOH4]CPRPRI(NOL), PFM(NOL)
    
    nolign=NOL+1
    End
    ##########################################################################
    # -------------------------------------- QTY ------------------------
    ########################################
    Subprog IB_QTY
    Local Integer NOL : NOL=nolign-1
    
    Local Integer LBOMALT # 241331
    Local Char LECCVALMAJ(GLONECS), LECCVALMIN(GLONEVL) # 241331
    
    # Bouton   1 : Article site
    # Bouton   2 : Stock par site
    # Bouton   3 : Filtre allocation
    # Bouton   4 : Visu détail allocation
    # Bouton   5 : Stock dispo
    # Bouton   6 : Article de remplacement
    # Bouton   7 : Stock projeté           # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line
    
    # Button   8 : Trial kitting           # 241331
    
    # Désactivation boutons Article-site, Stock par site, Filtre allocation, Stock dispo
    # --> Si article non géré en stock
    If [M:SOH4]STOMGTCOD(NOL) = 1 Raz GBOUT1, GBOUT2, GBOUT3, GBOUT5,GBOUT7 : Endif # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : added GBOUT7
    # ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line
    
    # Désactivation bouton détail allocation
    # --> Si Allocation globale ou aucune allocation
    #If [M]DALLTYP(NOL) = 1 | ([M]ALLQTY(NOL) = 0 & [M]SHTQTY(NOL) = 0)
    # --> Si aucune allocation
    If ([M]ALLQTY(NOL) = 0 & [M]SHTQTY(NOL) = 0) Raz GBOUT4 : Endif
    
    # Désactivation bouton article remplacement
    If [M]ITMREF(NOL) = ""
        Raz GBOUT6
    Else
        If [F:ITM]ITMREF <> [M:SOH4]ITMREF(NOL)
            Read [F:ITM]ITM0 = [M:SOH4]ITMREF(NOL)
            If fstat  Raz [F:ITM] : Endif
        Endif
    #   --> Si ligne non normale, ou si allocation, ou si contremarque
        If [F:ITM]RPLITM = "" | [M]LINTYP(NOL) <> 1 | sum([M]TALLQTY(NOL),[M]SHTQTY(NOL),[M]LPRQTY(NOL)) <> 0 |
    &      [M]FMINUM(NOL) <> ""
            Raz GBOUT6
        Endif
    Endif
    
    # Issue 241331 - 2021-05-06 by STLIG : disable trial kitting button
    If dim([M:SOH4]ECCVALMAJ) > 0
      LECCVALMAJ = [M:SOH4]ECCVALMAJ(NOL)
      LECCVALMIN = [M:SOH4]ECCVALMIN(NOL)
    Endif
    If !func SUBBMR.DEF_BOM([M:SOH4]ITMREF(NOL),
    &                       LECCVALMAJ,
    &                       LECCVALMIN,
    &                       LBOMALT)
      Raz GBOUT8
    Endif
    
    End
    ########################################
    Subprog AS_QTY(VALEUR)    : # --- Web - Obligatoire - Synchrone
    Variable Decimal VALEUR
    Local    Integer NOL    :    NOL=nolign-1
    
    # Issue X3-126595
    ##If !GIMPORT
    If !GIMPORT & !(dim(GWEBSERV)=1 & GWEBSERV=1)
    # End issue X3-126595
       If ([M]LINTYP(NOL)>2 & [M]LINTYP(NOL)<6) | ([M]LINTYP(NOL)>10 & [M]LINTYP(NOL)<14) mkstat=2 : Endif
    Endif
    
    # Pas de modif qté si commande générée à partir de la commande d'achat
    If [M:SOH0]ORIFCY<>"" & [M:SOH0]ORIFCY<>[M:SOH0]SALFCY : mkstat=2 Endif
    # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line
    Gosub DISPLAY_QTY_STOCKSTATUS From SUBSOH1
    ## Issue 113880
    ## This display (GERR=4) is no more possible with web client
    #End
    ## End issue 113880
    
    End
    # /User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO
    ########################################
    Subprog C_QTY(VALEUR)
    Variable Decimal VALEUR
    Local    Integer NOL        : NOL=nolign-1
    Local    Decimal WQTY
    # Issue X3-200515/X3-207051 - 2020-09-16 by SR : Add the min quantity after the error message
    Local    Decimal WQTY_INVCND : Raz WQTY_INVCND
    # 200515 : Progress billing / X3-216438 : Blocking control on quantity or net price update when all scheduled invoices are linked to progress status - 2020-11-19 by LD
    # Flag to know if all scheduled invoices are linked to progress status
    # =1 There is a scheduled invoices lines not linked to a progress status
    # =2 All scheduled invoices are linked to progress status
    Local Integer WALLPRGBILLIN : WALLPRGBILLIN=1
    # 200515 : Progress billing / X3-216438 : Blocking control on quantity or net price update when all scheduled invoices are linked to progress status - 2020-11-19 by LD
    
    # --------------------------------------------------------------- #
    # Penser à mettre en phase l'inter-societe  (C_QTY de TRTVENISOC) #
    # --------------------------------------------------------------- #
    #-----------------------------------------------------------#
    # Ctr par rapport qte mini et qte maxi                      #
    # --> En retour GMESSAGE et mkstat à 2 ou GERR=2            #
    #---------------------------------------------------------- #
    Gosub CTR_QTY From SUBSOHB
    If mkstat=2 End : Endif
    #-----------------------------------------------------------------------------------------#
    # Si on modifie la qté commandée initiale :                                               #
    #     Elle ne doit pas être inférieure à ce qui est déjà alloué, préparé et livré/facturé #
    #-----------------------------------------------------------------------------------------#
    #If [M:SOH0]SOHCAT = 3
    #    WQTY = [M:SOH4]ALLQTY(NOL)+[M:SOH4]SHTQTY(NOL)+[M:SOH4]INVQTY(NOL)+[M:SOH4]ODLQTY(NOL)
    #Else
    #    WQTY = [M:SOH4]ALLQTY(NOL)+[M:SOH4]SHTQTY(NOL)+[M:SOH4]DLVQTY(NOL)+[M:SOH4]ODLQTY(NOL)
    #Endif
    WQTY = [M:SOH4]TALLQTY(NOL)+[M:SOH4]SHTQTY(NOL)+[M:SOH4]LPRQTY(NOL)
    If VALEUR < WQTY & VALEUR <> [M:SOH4]YQTY(NOL)
          # Issue X3-231425 - 2021-02-17 by MUARN : new message add invoiced
          #mkstat=2: If GERR=2 GMESSAGE+= "\" Endif : GMESSAGE+=mess(312,192,1) : End
          mkstat=2: If GERR=2 GMESSAGE+= "\" Endif : GMESSAGE+=mess(603,192,1) : End
    Endif
    
    # On prévient si la modification de la qté cdée solde la ligne de commande
    If [M]SOQSTA(NOL) <> 3 & [M]ALLQTY(NOL) = 0 & [M]WALLQTY(NOL) = 0
            # 107888 : Scheduled invoices : (LD:19/05/16)
    ##   -- Commande normale
    #    If ([M:SOH0]SOHCAT <> 3 & ([M]DLVQTY(NOL) + [M]ODLQTY(NOL) >= VALEUR)) |
    #&      ([M:SOH0]SOHCAT = 3  & ([M]INVQTY(NOL) + [M]ODLQTY(NOL) >= VALEUR))
    
    #           Commande normale/prêt et ligne livrable désolde sf si Totalement livrée
    #           Commande normale et ligne non livrable  désolde sf si Totalement facturée
    #           Commande à facturation directe          désolde sf si Totalement facturée
               If ([M:SOH0]SOHCAT <> 3 & [M]DLVFLG(NOL)=2   & ([M]DLVQTY(NOL) + [M]ODLQTY(NOL)) >= VALEUR) |
    &             ([M:SOH0]SOHCAT <> 3 & [M]DLVFLG(NOL)=1 & ([M]INVQTY(NOL) + [M]ODLQTY(NOL)) >= VALEUR) |
    &             ([M:SOH0]SOHCAT =  3 & ([M]INVQTY(NOL) + [M]ODLQTY(NOL)) >= VALEUR)
            # 107888 : Scheduled invoices : (LD:19/05/16)
                  If GERR=2 GMESSAGE+= "\" Endif : GMESSAGE+=mess(103,191,1)
                  Local Integer WOK : WOK=2
                  Call AVERTIR (GMESSAGE, WOK) From GESECRAN
                  If WOK=1 mkstat=2 : End : Endif
               Endif
    Endif
    Gosub VERIF_CPSALLQTY From SUBSOH1 : If mkstat=2 End Endif
    
    # Issue X3-200515/201739 - 2020-07-29 by MUARN : Control quantity on sales order lines
    #  the quantity can't be lower than the invoiced quantity plus the validated quantity on progress status
    Raz GERR
    If dim([M:SOH4]PRGBILNUM)> 0 & [M:SOH4]PRGBILNUM(NOL)<>""
      # Issue X3-200515/X3-207051 - 2020-09-16 by SR : Add the min quantity after the error message
      #If VALEUR < func LIBSAL_INVCND_SOH.C_QTY_INVCND
      # 200515 : Progress billing / X3-216438 : Blocking control on quantity or net price update when all scheduled invoices are linked to progress status - 2020-11-19 by LD
      #WQTY_INVCND = func LIBSAL_INVCND_SOH.C_QTY_INVCND
      WQTY_INVCND = func LIBSAL_INVCND_SOH.C_QTY_INVCND (WALLPRGBILLIN)
      If VALEUR <> [M:SOH4]QTY(NOL) & WALLPRGBILLIN=2
        GMESSAGE=mess(294,191,1)-mess(601,192,1)
        mkstat=2 : End
      Endif
      # 200515 : Progress billing / X3-216438 : Blocking control on quantity or net price update when all scheduled invoices are linked to progress status - 2020-11-19 by LD
      If VALEUR < WQTY_INVCND
        GMESSAGE=mess(585,192,1)-"("+format$("N:"+GFMTQTY, num$(WQTY_INVCND))+")"
        mkstat=2
      Elsif GERR>0
        mkstat=2
      Endif
    Endif
    # End issue X3-200515/201739
    
    End
    ########################################
    Subprog AP_QTY(VALEUR)
    Variable Decimal VALEUR
    If [M]STOMGTCOD(nolign-1)=1 End Endif
    
    End
    ########################################
    Subprog AM_QTY(VALEUR)
    Variable Decimal VALEUR
    Local    Integer  NOL     : NOL=nolign-1
    Local    Shortint TYP
    Local    Decimal  QTY_UV, QTY_UV1, COEF
    Local    Integer  WRECH_TAR
    Local    Decimal  WSNETPRI, WSNETPRINOT, WSNETPRIATI : # Bug 70861
    Local    Decimal  WQTY    # Issue X3-200515/216719 - 2020-10-13 by MUARN : pour contrôle montant mini déjà facturé en progress billing
    
    Local    Decimal WCPO_QTY : WCPO_QTY = [M:SOH4]QTY(NOL) # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    
    # Controle article-site
    Call CONTITF([M:SOH4]ITMREF(NOL),[M:SOH4]DSTOFCY(NOL),[M:SOH4]STOMGTCOD(NOL)) From TRTVENCTL
    If mkstat = 2 GERR=1 : End : Endif
    
    # Controle lié à la contremarque
    Gosub CTR_CTM From SUBSOHB : If mkstat=2 End Endif
    # Controle lié à l'inter-site : 15/01/04 : On bloque la modif de qté si inter-site
    #Gosub CTR_BETFCY From SUBSOHB : If mkstat=2 End Endif
    
    # Traitement d'une ligne de contremarque
    Gosub TRT_CTM From SUBSOH1
    
    # Si la qté cdée a évoluée, Init de la qté à allouer selon paramètre :
    # Si Init de la qté à allouer à oui et
    # Si Pas de gestion des signatures Ou (Allocation et encours article cdes non signées à oui Ou cde signée)
    #85683 : Init qté à allouer à tord
    #If GINIALLORD=2 & (GAPPSOH<>2 | ((GSOHAPPORD=2 & GSOHAPPALL=2) | [M:SOH1]APPFLG>2))
    If GINIALLORD=2 & (GAPPSOH<2 | ((GSOHAPPORD=2 & GSOHAPPALL=2) | [M:SOH1]APPFLG>2))
    #85683
        Local Decimal WSAUSTUCOE : WSAUSTUCOE=[M]SAUSTUCOE(NOL)
        Gosub INIT_WALLQTYSTU From SUBSOH1
    Endif
    
    # --> Calcul des montants de base calcul de taxe
    Local    Decimal WUNTCLCAMT1, WUNTCLCAMT2 : Raz WUNTCLCAMT1, WUNTCLCAMT2
    If [M]QTY(NOL) <> 0
        WUNTCLCAMT1=[M]CLCAMT1(NOL)/[M]QTY(NOL) : WUNTCLCAMT2=[M]CLCAMT2(NOL)/[M]QTY(NOL)
    Endif
    Call ALICLCAMT([M:SOH4]ITMREF(NOL), VALEUR, NOL, "SOH4", [M:SOH4]CLCAMT1(NOL), [M:SOH4]CLCAMT2(NOL)) From TRTX3
    # Pas de recherche tarif pour les gratuits
    If [M:SOH4]FOCFLG(NOL) = 3 End : Endif
    #-------------------------------------------#
    # Recherche tarif si modif qte ou creation  #
    #-------------------------------------------#
    If GMODIF = 0
        WRECH_TAR = 1
        # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
        # If the sales order line is linked to a progress billing
        # If there is scheduled invoices linked to a billing situation not invoiced we can't modify the price (to avoid bad price when invoicing)
        # So price calculation has to be inhibited
        # This working flag indicates if, for the sales order line, there is scheduled invoices linked to a billing situation not invoiced
        If dim([M:SOH4]PBILDTOINV) <= 0 | [M:SOH4]PBILDTOINV(NOL)=1
        #   Price calculation can be done only if progress billing is not activated or if there is no scheduled invoices linked to a billing situation not invoiced
        # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
          If [M:SOH4]FOCFLG(NOL) = 2
              GMESSAGE = mess(7,191,1)+"\"+mess(21,191,1)
          Else
              GMESSAGE = mess(21,191,1)
          Endif
          Call OUINON(GMESSAGE,WRECH_TAR) From GESECRAN
          Raz GMESSAGE
          If WRECH_TAR=2 & find([M:SOH4]LINTYP(NOL),2,6,10) GTARFLG="1" Endif : # Bug 62571
        # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
        Endif
        # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
    Else
        WRECH_TAR= 2
    Endif
    If WRECH_TAR = 2
        # --------------- Recherche tarif -----------------
        # Article normal ou composé
        TYP=1
        # Composant
        If find([M:SOH4]LINTYP(NOL),3,4,5,7,8,9,11,12,13)
            Local Integer ORI : ORI=NOL
            While !find([M]LINTYP(ORI),2,6,10) & ORI >= 0 ORI-=1 Wend
            If find([M]LINTYP(ORI),2,6,10) GPNTITMREF=[M]ITMREF(ORI) Endif
            TYP=4
        Endif
        # --> Recherche tarif
        Call RECH_TARIF(TYP,[M]ITMREF(NOL),NOL,VALEUR,"SOH",[M]GROPRI(NOL)) From TRTVENTAR
    Endif
    
    # Bug 70861 : Recalcul prix net si recherche tarif ou si ligne directe (car impact des frais/remise par ligne sur le prix net)
    WSNETPRI=[M]NETPRI(NOL) : WSNETPRINOT=[M]NETPRINOT(NOL) : WSNETPRIATI=[M]NETPRIATI(NOL)
    If WRECH_TAR=2 | [M]DETSQHNUM(NOL) = ""
        # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
        # If the sales order line is linked to a progress billing
        # If there is scheduled invoices linked to a billing situation not invoiced we can't modify the price (to avoid bad price when invoicing)
        # This working flag indicates if, for the sales order line, there is scheduled invoices linked to a billing situation not invoiced
        If dim([M:SOH4]PBILDTOINV) > 0 & [M:SOH4]PBILDTOINV(NOL)=2
          # Simulation Netpri calcul to see if the price is modified
          Local Decimal  WNETPRI, WQTY
          Local Integer I : I=NOL
          WQTY=VALEUR
          Gosub SIMUL_NETPRI From SUBSOHB
          If [M:SOH4]NETPRI(NOL)<>WNETPRI
            GMESSAGE=mess(293,191,1)-"\"-mess(601,192,1)-":"-mess(582,192,1) : mkstat=2 : End
          Endif
        Endif
        # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
        # --> Calcul du prix net
        Call CLCNETPRI(VALEUR, [M:SOH0]CUR, NOL) From TRTVENPRI
        # Issue X3-200515/X3-208171 - 2020-09-08 by SR : Progress billing
        #If GDACLOK = 1
        If GDACLOK = 1 | (dim([M:SOH4]PRGBILNUM) > 1 & [M:SOH4]PRGBILNUM(NOL) <> "")
            # Issue X3-200515/216719 - 2020-10-13 by MUARN : pour contrôle montant mini déjà facturé en progress billing
            WQTY = [M:SOH4]QTY(NOL)
            [M:SOH4]QTY(NOL) = VALEUR
            # End issue X3-200515/216719
            Call CTLNETPRI([M:SOH0]BPCORD,[M:SOH0]CHGTYP,[M:SOH0]ORDDAT,[M:SOH0]CUR,NOL) From TRTVENPRI
            # Issue X3-200515/216719 - 2020-10-13 by MUARN : pour contrôle montant mini déjà facturé en progress billing
            [M:SOH4]QTY(NOL) = WQTY
            # End issue X3-200515/216719
            If mkstat=2 End Endif
        Endif
    Endif
    # Bug 70861
    
    # -- Calcul de la marge ssi recherche tarif ou mnts base clc taxe modifiés
    If WRECH_TAR=2 | [M]CLCAMT1(NOL)/VALEUR<>WUNTCLCAMT1 | [M]CLCAMT2(NOL)/VALEUR<>WUNTCLCAMT2
    &              | [M]NETPRI(NOL)<>WSNETPRI | [M]NETPRINOT(NOL)<>WSNETPRINOT | [M]NETPRIATI(NOL)<>WSNETPRIATI : # Bug 70861
        [M]QTY(NOL)=VALEUR
        Call CLCPFM([M]DSTOFCY(NOL), [M:SOH1]PRITYP, [M]CHGTYP, [M:SOH0]ORDDAT, [M:SOH0]CUR, NOL, 2) From TRTVENPRI
        If GDACLOK = 1
            Call CTLPFM([M:SOH0]CUR,[M:SOH4]CPRPRI(NOL), NOL) From TRTVENPRI
            If mkstat=2 End Endif
        Endif
        Affzo [M:SOH4]CPRPRI(NOL)
        Affzo [M:SOH4]PFM(NOL)
    Endif
    If WRECH_TAR=2 | [M]DETSQHNUM(NOL) = ""      : # Bug 70861
        Gosub AFF_RECH_TAR
    # bug 15688 : Ctrl reporté en action ctrl du prix
    #    If find([M]LINTYP(NOL),1,2,6)
    #        If [M]FOCFLG(NOL) <> 3 & [M]GROPRI(NOL)=0 & !GIMPORT
    #            GERR=3:GMESSAGE=mess(62,194,1)
    #        Endif
    #    Endif
    Endif
    
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #--Changing the quantity or due to the price search, the invoice schedule has to be updated
    If [M:SOH4]DINVCND(NOL)<>"" and WCPO_QTY<>VALEUR #CPO 18/01/2016 : and [M:SOH4]QTY(NOL)<>0
      [M:SOH4]DINVCNDTOUPD(NOL)=[V]CST_AYES
      [M:SOH4]DINVCNDTODIS(NOL)=[V]CST_AYES #CPO 18/01/2016 Thus, we only do it once after an order line modification
      #--Here it is to early to call the redispatch for the global invoice condition schedule associated to the line
      #--It will be done in "after line" action on P1_NBLIG
    Else
      [M:SOH4]DINVCNDTOUPD(NOL)=[V]CST_ANO
      [M:SOH4]DINVCNDTODIS(NOL)=[V]CST_ANO #CPO 18/01/2016
    Endif
    # End issue 107888
    
    # Issue X3-62703 - 2017-11-07 by CPO : Available stock display
    If (NOL>([M]NBLIG-1)) or [M:SOH4]UPDFLG(NOL)=0 #--to avoid doing it twice for a newly inserted line (already done in AS_WALLQTY for nolign<=[M]NBLIG)
      Gosub DISPLAY_QTY_STOCKSTATUS From SUBSOH1 # Issue X3-62703 - 2017-11-07 by CPO : Available stock display
    Endif
    # End issue X3-62703
    
    Gosub UPD_PREP_MESS From SUBSOHA1  # X3-246884 By SDEM
    
    nolign=NOL+1
    Raz [M:SOH4]TDLQTY(NOL), [M:SOH4]TDLQTYSTU(NOL)
    End
    
    # Issue 241331 - 2021-05-06 by STLIG : power trial kitting button
    Subprog B8_QTY(VALEUR)
    Variable Decimal VALEUR
    Local Char SAVACT(20) : SAVACT = ""
    Local Char LPARAM(250)(1..20) : Raz LPARAM
    Local Char LVALEUR(10) : LVALEUR = ""
    Local Char LECCVALMAJ(GLONECS), LECCVALMIN(GLONEVL) : Raz LECCVALMAJ, LECCVALMIN
    Local Integer LBOMALT
    
    If dim([M:SOH4]ECCVALMAJ) > 0
      LECCVALMAJ = [M:SOH4]ECCVALMAJ(nolign-1)
      LECCVALMIN = [M:SOH4]ECCVALMIN(nolign-1)
    Endif
    
    LPARAM(1) = [M:SOH0]SALFCY
    LPARAM(2) = num$(func SUBBMR.DEF_BOM([M:SOH4]ITMREF(nolign-1),
    &                                    LECCVALMAJ,
    &                                    LECCVALMIN,
    &                                    LBOMALT))
    LPARAM(3) = num$(LBOMALT)
    LPARAM(4) = date$
    LPARAM(5) = [M:SOH4]ITMREF(nolign-1)
    LPARAM(6) = "SOH4"
    LPARAM(7) = num$(VALEUR)
    LPARAM(8) = LECCVALMAJ
    LPARAM(9) = LECCVALMIN
    
    SAVACT = GACTION
    GACTION = "BOMRET"
    Call TRAITE_CHAR(LVALEUR, LPARAM, "FBOMRET", "SUBBMR", "DBOMRET", 3, "") From GTRAITE
    GACTION = SAVACT
    
    End
    
    # ------------------------------------ ALLQTY ------------------------
    Subprog AV_ALLQTY(VALEUR)
    Variable Decimal VALEUR
    If VALEUR=0 | nolign>[M]NBLIG End Endif
    Gosub COLOR_KIT
    End
    # ------------------------------------ WALLQTY ------------------------
    ########################################
    Subprog IB_WALLQTY
    
    # Bouton   1 : Stock par site
    # Bouton   2 : Filtre allocation
    # Bouton   3 : Visu détail allocation
    # Bouton   5 : Stock dispo
    # Bouton   6 : Stock projeté          # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line
    # Désactivation bouton filtre allocation
    # --> Si article non géré en stock ou si FMI n'est pas sur stock
    #If [M]STOMGTCOD(nolign-1) = 1 | [M]FMI(nolign-1) <> 1
    # --> Si article non géré en stock
    If [M]STOMGTCOD(nolign-1) = 1 Raz GBOUT2, GBOUT6 : Endif # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : added GBOUT6 ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line
    # Désactivation bouton visu détail allocation
    # --> Si allocation globale ou aucune allocation
    #If [M]DALLTYP(nolign-1) = 1 | ([M]ALLQTY(nolign-1) = 0 & [M]SHTQTY(nolign-1) = 0)
    # --> Si aucune allocation
    If ([M]ALLQTY(nolign-1) = 0 & [M]SHTQTY(nolign-1) = 0) Raz GBOUT3 : Endif
    End
    ########################################
    Subprog AV_WALLQTY(VALEUR)
    Variable Decimal VALEUR
    If VALEUR=0 | nolign>[M]NBLIG End Endif
    Gosub COLOR_KIT
    
    End
    ########################################
    Subprog AS_WALLQTY(VALEUR)    : # --- Web - Obligatoire - Synchrone
    Variable Decimal VALEUR
    Local    Integer NOL : NOL = nolign-1
    Local    Integer OK : OK=2
    Local    Decimal WCOE
    Local    Decimal WRALLQTY, WTALLQTY, WFIRAVAQTY
    Local    Date    WFIRAVADAT
    # ---------- Pas de saisie de la quantité allouée ------------
    # --> Gestion des signatures et (Pas d'encours cde non signée ou Pas d'allocation cde non signée et la cde n'est pas signée)
    If GAPPSOH>1 & ((GSOHAPPORD=1 | GSOHAPPALL=1) & [M:SOH1]APPFLG<=2) mkstat=2 Endif
    # --> La commande bloquée
    # --> Ce n'est pas une ligne ferme
    If find([M:SOH1]CDTSTA,2,5) | [M]DEMSTA(NOL) <> 1 mkstat = 2 : End : Endif
    # --> Contremarque ou Ordre de production
    #If find([M]FMI(NOL),2,3,5)  mkstat=2 : End : Endif
    If [M]FMI(NOL)=2 mkstat=2 : End : Endif
    
    If func MANHLDLIB.BLK_ALLOC([M:SOH1]HLDSTA,[M:SOH1]HLDCOD) : mkstat=2 : End : Endif  # order holds
    
    # --> Article non géré en stock et ce n'est pas un kit/sous-traité
    #If !find([M]LINTYP(NOL),2,10)  & [M]STOMGTCOD(NOL) = 1 mkstat = 2 : End : Endif                    : # Bug 71111
    If !GIMPORT                                                                                         : # Bug 71111
        If !find([M]LINTYP(NOL),2,10) & [M]STOMGTCOD(NOL) = 1 mkstat = 2 : End : Endif                  : # Bug 71111
    Else                                                                                                : # Bug 71111
        If !find([M]LINTYP(NOL),2,3,4,5,10,11,12,13) & [M]STOMGTCOD(NOL) = 1 mkstat = 2 : End : Endif   : # Bug 71111
    Endif
    # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line
    ## Issue 113880
    ## This display (GERR=4) is no more possible with web client
    #End
    ## End issue 113880
    
    # Issue X3-62703 - 2017-11-07 by CPO : Available stock display
    # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line
    #--moved call from AV_WALLQTY to AS_WALLQTY as the AV_ is also called when entering to the fonction/going to another order (performance)
    #--test on nolign opposite to the one done in AM_QTY to avoid calling twice also
    #--only for existing lines not modified
    #--the only problem I see is that the UPDFLG/CREFLG flags are setted in _NBLIG...
    If (NOL<=([M]NBLIG-1) and [M:SOH4]UPDFLG(NOL)<>0) or (dim([M]WSTKTXT)>0 and [M]WSTKTXT="" and [M:SOH4]CREFLG(NOL)<>0 and [M:SOH4]UPDFLG(NOL)=0)
      Gosub DISPLAY_QTY_STOCKSTATUS From SUBSOH1
    Endif
    # End issue X3-62703
    
    Gosub DISPLAY_ALLQTY_STOCKSTATUS From SUBSOH1
    
    End
    # /User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO
    ########################################
    Subprog AP_WALLQTY(VALEUR)
    Variable Decimal VALEUR
    If [M]STOMGTCOD(nolign-1)=1 End Endif
    
    # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line
    #GERR=4 : GMESSAGE = "               "
    # Issue X3-128239
    #If !GIMPORT and !GWEBSERV and dim([M]WALLTXT)>0
    #  Raz [M]WALLTXT : Affzo [M]WALLTXT
    #Endif
    If !GIMPORT and !GWEBSERV and dim([M:SOH4]WALLTXT)>0
      Raz [M:SOH4]WALLTXT : Affzo [M:SOH4]WALLTXT
    Endif
    # End issue X3-128239
    # /User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO
    
    End
    ########################################
    Subprog AM_WALLQTY(VALEUR)
    Variable Decimal VALEUR
    
    Local    Integer NOL : NOL=nolign-1
    Local    Decimal WALLQTY, WALLCLI
    Local    Decimal WTOTDLVQTY, WCOEF
    Local    Integer OK
    
      # --> Calcul du total déjà préparé/livré
      WTOTDLVQTY = [M:SOH4]OPRQTY(NOL)+[M:SOH4]PREQTY(NOL)+[M:SOH4]ODLQTY(NOL)
      If [M:SOH0]SOHCAT = 3
        WTOTDLVQTY += [M:SOH4]INVQTY(NOL)
      Else
        WTOTDLVQTY += [M:SOH4]DLVQTY(NOL)
      Endif
      # --> Calcul de la nouvelle qté à allouer
      WALLQTY=VALEUR-([M:SOH4]ALLQTY(NOL)+[M:SOH4]SHTQTY(NOL))
      Raz GMESSAGE
      If WALLQTY > 0
        # Augmentation de la qté à allouer
        # -------------------------------------
        # FGR 10/03/2015 : X3SUIVI23273 (début)
        # --> Blocage si dépassement en-cours
        If !([M:SOH1]BETFCY = 2 & [M:SOH1]BETCPY <> 2) or GCTLBETFCY = 2 Then
          #- Si pas (Intersit & non intersoc) ou si Ctrl intersit encours&prix
          If [M:SOH1]CDTSTA = 3 & GCDTUNL = 1 Then
            mkstat = 2
            GMESSAGE = mess(101,197,1)
            End
          Elsif [M:SOH1]CDTSTA = 3 Then
            # --> Si pas de blocage et dépassement d'en-cours : Dde de confirmation
            GMESSAGE = mess(101,197,1)
          Elsif [M:SOH1]CDTSTA = 4 Then
            # --> Si Acompte non versé : Dde de confirmation
            GMESSAGE = mess(102,197,1)
          Endif
        Elsif [M:SOH1]CDTSTA = 4 Then
          # --> Si Acompte non versé : Dde de confirmation
          GMESSAGE = mess(102,197,1)
        Endif
        # FGR 10/03/2015 : X3SUIVI23273 (fin)
        # -------------------------------------
        # --> Ligne de contremarque
        If find([M:SOH4]FMI(NOL),3,5)
          If GMESSAGE<>"" GMESSAGE+="\" Endif
          If [M:SOH4]FMI(NOL)=3
            GMESSAGE+=mess(281,197,1)
            If [M:SOH4]FMINUM(NOL)<>"" GMESSAGE-=":"-mess(142,191,1) : Endif
          Endif
          If [M:SOH4]FMI(NOL)=5
            GMESSAGE+=mess(280,197,1)
            If [M:SOH4]FMINUM(NOL)<>"" GMESSAGE-=":"-mess(143,191,1) : Endif
          Endif
        Endif
      Endif
      # --> Si qté allouée supérieure à la qtée cdée : Dde de confirmation
      If VALEUR + WTOTDLVQTY > [M:SOH4]QTY(NOL)
        If GMESSAGE<>"" GMESSAGE+="\" Endif
        GMESSAGE+=mess(213,191,1)
      Endif
      # -->Livraison ligne/cde complète : On doit tout allouer
      If find([M:SOH2]DME,2,3)
        #   Si la qté à allouer est inférieure au reste à allouer : Dde confirmation
        If VALEUR < [M]QTY(NOL) - WTOTDLVQTY
          If GMESSAGE<>"" GMESSAGE+="\" Endif
          GMESSAGE+=mess(295,192,1)
        Endif
        If [M]STOMGTCOD(NOL) > 1
          #       Calcul stock disponible
          Local Integer WRET
          Local Decimal WSTUDISSTU
          Local Char    WNUM
    
          If find(GUSERERBPC, 2,3) WNUM=vireblc(format$("K:15X",[M]BPCORD)+format$("K:3X",[M]DBPAADD(NOL)), 1) : Endif
            #--- Issue 115110 : Added LECCVAL parameter in 10th position
            Call STODISALL([M]DSTOFCY(NOL),[M]ITMREF(NOL),2,[M]DALLTYP(NOL),2,2,1,"",WNUM,"",WSTUDISSTU,WRET) From STKALL
            If WRET=0
              #           La qté à allouer doit être disponible
              If WSTUDISSTU < [M]WALLQTYSTU(NOL)
                GMESSAGE = mess(163,197,1)+num$(WSTUDISSTU)-[M]STU(NOL)
                If [M]DALLTYP(NOL) = 2 & [M]LOT(NOL) <> "" GMESSAGE -= mess(43,197,1)-":"-[M]LOT(NOL) Endif
                If [M]DALLTYP(NOL) = 2 & [M]LOC(NOL) <> "" GMESSAGE -= mess(426,197,1)-[M]LOC(NOL) Endif
                mkstat=2 : GMESSAGE += "\"+mess(44,192,1) : End
              Endif
            Endif
          Endif
      Endif
      If GMESSAGE <> ""
        GMESSAGE+="\"+mess(205,100,1)
        OK=1: Call OUINON(GMESSAGE,OK) From GESECRAN
        Raz GMESSAGE : If OK=1 mkstat=2 : End : Endif
      Endif
      If WALLQTY <=0 End : Endif
      # Dde d'utilisation des réservations clients
      If GUSERERBPC=3
        [M]RERBPCFLG(NOL)=1
        Local Char WVCRRER(250)
    
        WVCRRER= vireblc(format$("K:"+num$(GLONBPC)+"X",[M]BPCORD)+format$("K:"+num$(GLONBPD)+"X",[M]DBPAADD(NOL)), 1)
        Call CAL_RERQTY(1,[M]ITMREF(NOL),[M]DSTOFCY(NOL),WVCRRER,[M]DSHIDAT(NOL),WALLCLI) From STKALL
        If WALLCLI <> 0
          GMESSAGE = mess(131,191,1)-num$(WALLCLI)-[M]STU(NOL)
          OK=2 : Call OUINON (GMESSAGE-"\"-mess(130,191,1),OK) From GESECRAN
          If OK = 2 [M]RERBPCFLG(NOL)=2 : Endif
        Endif
      Endif
    End
    
    ########################################
    # ------------------------------------ DALLTYP ------------------------
    ########################################
    Subprog AS_DALLTYP(VALEUR)
    Variable Integer VALEUR
    Local Integer NOL : NOL=nolign-1
    # Article non géré en stock et ce n'est pas un kit/sous-traité
    If !find([M]LINTYP(NOL),2,10) & [M]STOMGTCOD(NOL) = 1 mkstat = 2 : End : Endif
    # Le type d'allocation n'est plus modifiable s'il y a des allocations
    If sum([M]ALLQTY(NOL), [M]SHTQTY(NOL)) mkstat=2 Endif
    If find([M]FMI(NOL),3,5) mkstat=2 Endif
    End
    # ------------------------------------ GROPRI ------------------------
    ########################################
    Subprog AS_GROPRI(VALEUR)    : # --- Web - Obligatoire - Synchrone
    Variable Decimal VALEUR
    
    If [M:SOH4]FOCFLG(nolign-1)<>3 End Endif
    # Article gratuit :
    # Non saisissable en modification de la ligne (création ou modif de cde)
    # Bug 49093 : On ne laisse ainsi saisissable en création de la ligne pour l'import
    If [M]UPDFLG(nolign-1)<>0 | [M]CREFLG(nolign-1)<>0 mkstat=2 Endif
    End
    
    ########################################
    Subprog C_GROPRI(VALEUR)
    Variable Decimal VALEUR
    
      # En création d'une ligne ou si modification du prix
      If ([M]CREFLG(nolign-1) = 0 & [M]UPDFLG(nolign-1) = 0) | [M]GROPRI(nolign-1) <> VALEUR Then
        # Pas de message si import de composants kit/sous-traité ou nomenclature
        # important : test sur la classe [F] du buffer import
        If GIMPORT & find([F:SOP]LINTYP,3,4,5,7,8,9,11,12,13) Then
          End
        Endif
        # Si article normal non gratuit, avertissement si prix à 0
        If find([M]LINTYP(nolign-1),1,2,6,10) & [M]FOCFLG(nolign-1) <> 3 & VALEUR = 0 Then
          Local Integer OK
    
          OK = 2       # ok=2 bug 13059 autoriser import prix nul
          If !([M:SOH1]BETFCY = 2 & [M:SOH1]BETCPY <> 2) or GCTLBETFCY = 2 Then          # FGR 10/03/2015 : X3SUIVI23273 Si pas (Intersit & non intersoc) ou si Ctrl intersit encours&prix
            Call AVERTIR(mess(62,194,1),OK) From GESECRAN
          Endif
          If OK <> 2 Then
            mkstat = 2
          Endif
        Endif
      Endif
    
    # 200515 : Progress billing / X3-217059 : Blocking control modification on price structure updates on sales order line - 2020-10-06 by LD
    If VALEUR <> [M:SOH4]GROPRI(nolign-1)
      Gosub C_DISCRGVALX
      If mkstat=2 End Endif
    Endif
    # 200515 : Progress billing / X3-217059 : Blocking control modification on price structure updates on sales order line - 2020-10-06 by LD
    
    Gosub UPD_PREP_MESS From SUBSOHA1 # X3-246884 By SDEM
    
    End
    
    ########################################
    Subprog AM_GROPRI(VALEUR)
    Variable Decimal VALEUR
    
    # Le prix ne peut être à 0 pour les articles normaux non gratuits
    #If [M]LINTYP(nolign-1) = 1 | [M]LINTYP(nolign-1) = 2 | [M]LINTYP(nolign-1) = 6
    #    If [M]FOCFLG(nolign-1) <> 3 & VALEUR =0
    #        Local Integer OK : OK=2     : # ok=2 bug 13059 autoriser import prix nul
    #        Call AVERTIR(mess(62,194,1),OK) From GESECRAN
    #        If OK <> 2 mkstat=2 : Endif
    #    Endif
    #Endif
    End
    ########################################
    Subprog AS_DISCRGVAL1(VALEUR)
    Variable Decimal VALEUR
    If [M:SOH4]FOCFLG(nolign-1)<>3 End Endif
    # Article gratuit :
    # Non saisissable en modification de la ligne (création ou modif de cde)
    # Bug 49093 : On ne laisse ainsi saisissable en création de la ligne pour l'import
    If [M]UPDFLG(nolign-1)<>0 | [M]CREFLG(nolign-1)<>0 mkstat=2 Endif
    End
    ########################################
    Subprog AS_DISCRGVAL2(VALEUR)
    Variable Decimal VALEUR
    If [M:SOH4]FOCFLG(nolign-1)<>3 End Endif
    # Article gratuit :
    # Non saisissable en modification de la ligne (création ou modif de cde)
    # Bug 49093 : On ne laisse ainsi saisissable en création de la ligne pour l'import
    If [M]UPDFLG(nolign-1)<>0 | [M]CREFLG(nolign-1)<>0 mkstat=2 Endif
    End
    ########################################
    Subprog AS_DISCRGVAL3(VALEUR)
    Variable Decimal VALEUR
    If [M:SOH4]FOCFLG(nolign-1)<>3 End Endif
    # Article gratuit :
    # Non saisissable en modification de la ligne (création ou modif de cde)
    # Bug 49093 : On ne laisse ainsi saisissable en création de la ligne pour l'import
    If [M]UPDFLG(nolign-1)<>0 | [M]CREFLG(nolign-1)<>0 mkstat=2 Endif
    End
    ########################################
    Subprog AS_DISCRGVAL4(VALEUR)
    Variable Decimal VALEUR
    If [M:SOH4]FOCFLG(nolign-1)<>3 End Endif
    # Article gratuit :
    # Non saisissable en modification de la ligne (création ou modif de cde)
    # Bug 49093 : On ne laisse ainsi saisissable en création de la ligne pour l'import
    If [M]UPDFLG(nolign-1)<>0 | [M]CREFLG(nolign-1)<>0 mkstat=2 Endif
    End
    ########################################
    Subprog AS_DISCRGVAL5(VALEUR)
    Variable Decimal VALEUR
    If [M:SOH4]FOCFLG(nolign-1)<>3 End Endif
    # Article gratuit :
    # Non saisissable en modification de la ligne (création ou modif de cde)
    # Bug 49093 : On ne laisse ainsi saisissable en création de la ligne pour l'import
    If [M]UPDFLG(nolign-1)<>0 | [M]CREFLG(nolign-1)<>0 mkstat=2 Endif
    End
    ########################################
    Subprog AS_DISCRGVAL6(VALEUR)
    Variable Decimal VALEUR
    If [M:SOH4]FOCFLG(nolign-1)<>3 End Endif
    # Article gratuit :
    # Non saisissable en modification de la ligne (création ou modif de cde)
    # Bug 49093 : On ne laisse ainsi saisissable en création de la ligne pour l'import
    If [M]UPDFLG(nolign-1)<>0 | [M]CREFLG(nolign-1)<>0 mkstat=2 Endif
    End
    ########################################
    Subprog AS_DISCRGVAL7(VALEUR)
    Variable Decimal VALEUR
    If [M:SOH4]FOCFLG(nolign-1)<>3 End Endif
    # Article gratuit :
    # Non saisissable en modification de la ligne (création ou modif de cde)
    # Bug 49093 : On ne laisse ainsi saisissable en création de la ligne pour l'import
    If [M]UPDFLG(nolign-1)<>0 | [M]CREFLG(nolign-1)<>0 mkstat=2 Endif
    End
    ########################################
    Subprog AS_DISCRGVAL8(VALEUR)
    Variable Decimal VALEUR
    If [M:SOH4]FOCFLG(nolign-1)<>3 End Endif
    # Article gratuit :
    # Non saisissable en modification de la ligne (création ou modif de cde)
    # Bug 49093 : On ne laisse ainsi saisissable en création de la ligne pour l'import
    If [M]UPDFLG(nolign-1)<>0 | [M]CREFLG(nolign-1)<>0 mkstat=2 Endif
    End
    ########################################
    Subprog AS_DISCRGVAL9(VALEUR)
    Variable Decimal VALEUR
    If [M:SOH4]FOCFLG(nolign-1)<>3 End Endif
    # Article gratuit :
    # Non saisissable en modification de la ligne (création ou modif de cde)
    # Bug 49093 : On ne laisse ainsi saisissable en création de la ligne pour l'import
    If [M]UPDFLG(nolign-1)<>0 | [M]CREFLG(nolign-1)<>0 mkstat=2 Endif
    End
    ########################################
    # 200515 : Progress billing / X3-217059 : Blocking control modification on price structure updates on sales order line - 2020-10-06 by LD
    Subprog C_DISCRGVAL1(VALEUR)
    Variable Decimal VALEUR
    If VALEUR <> [M:SOH4]DISCRGVAL1(nolign-1)
      Gosub C_DISCRGVALX
      If mkstat=2 End Endif
    Endif
    Gosub UPD_PREP_MESS From SUBSOHA1 # X3-246884 By SDEM
    End
    
    Subprog C_DISCRGVAL2(VALEUR)
    Variable Decimal VALEUR
    If VALEUR <> [M:SOH4]DISCRGVAL2(nolign-1)
      Gosub C_DISCRGVALX
      If mkstat=2 End Endif
    Endif
    Gosub UPD_PREP_MESS From SUBSOHA1 # X3-246884 By SDEM
    End
    
    Subprog C_DISCRGVAL3(VALEUR)
    Variable Decimal VALEUR
    If VALEUR <> [M:SOH4]DISCRGVAL3(nolign-1)
      Gosub C_DISCRGVALX
      If mkstat=2 End Endif
    Endif
    Gosub UPD_PREP_MESS From SUBSOHA1 # X3-246884 By SDEM
    End
    
    Subprog C_DISCRGVAL4(VALEUR)
    Variable Decimal VALEUR
    If VALEUR <> [M:SOH4]DISCRGVAL4(nolign-1)
      Gosub C_DISCRGVALX
      If mkstat=2 End Endif
    Endif
    Gosub UPD_PREP_MESS From SUBSOHA1 # X3-246884 By SDEM
    End
    
    Subprog C_DISCRGVAL5(VALEUR)
    Variable Decimal VALEUR
    If VALEUR <> [M:SOH4]DISCRGVAL5(nolign-1)
      Gosub C_DISCRGVALX
      If mkstat=2 End Endif
    Endif
    Gosub UPD_PREP_MESS From SUBSOHA1 # X3-246884 By SDEM
    End
    
    Subprog C_DISCRGVAL6(VALEUR)
    Variable Decimal VALEUR
    If VALEUR <> [M:SOH4]DISCRGVAL6(nolign-1)
      Gosub C_DISCRGVALX
      If mkstat=2 End Endif
    Endif
    End
    
    Subprog C_DISCRGVAL7(VALEUR)
    Variable Decimal VALEUR
    If VALEUR <> [M:SOH4]DISCRGVAL7(nolign-1)
      Gosub C_DISCRGVALX
      If mkstat=2 End Endif
    Endif
    Gosub UPD_PREP_MESS From SUBSOHA1 # X3-246884 By SDEM
    End
    
    Subprog C_DISCRGVAL8(VALEUR)
    Variable Decimal VALEUR
    If VALEUR <> [M:SOH4]DISCRGVAL8(nolign-1)
      Gosub C_DISCRGVALX
      If mkstat=2 End Endif
    Endif
    Gosub UPD_PREP_MESS From SUBSOHA1 # X3-246884 By SDEM
    End
    
    Subprog C_DISCRGVAL9(VALEUR)
    Variable Decimal VALEUR
    If VALEUR <> [M:SOH4]DISCRGVAL9(nolign-1)
      Gosub C_DISCRGVALX
      If mkstat=2 End Endif
    Endif
    Gosub UPD_PREP_MESS From SUBSOHA1 # X3-246884 By SDEM
    End
    ######################################################################################
    $C_DISCRGVALX
    
    If dim([M:SOH4]PBILDTOINV) <=0 Return Endif
    
    # PJM is activated
    # This working flag indicates if, for the sales order line, there is scheduled invoices linked to a billing situation not invoiced
    # In this case, we can't modify the price (to avoid bad price when invoicing)
    If [M:SOH4]PBILDTOINV(nolign-1)=2 GMESSAGE=(mess(582,192,1)) : mkstat=2 : Return Endif
    
    Return
    # 200515 : Progress billing / X3-217059 : Blocking control modification on price structure updates on sales order line - 2020-10-06 by LD
    
    # --------------------------------------- VACITM1 --------------------------------
    Subprog C_VACITM1(VALEUR)
    Variable Char    VALEUR()
    #--CPO 71937 Lors de l'import, [M]VACITM1(nolign-1)=VALEUR, mais il faut quand même faire une recherche de taxe
    #--car le niveau peut venir du fichier d'import
    #If [M]VACITM1(nolign-1)=VALEUR
    If [M]VACITM1(nolign-1)=VALEUR and !GIMPORT
    #--/
        Call CTLVAT([M]VAT1(nolign-1)) From TRTVENCTL
    Else
        Raz [M:SOH4]VAT1(nolign-1)        : # Bug 78972
        Call ALIVAT(VALEUR,11,1,[M:SOH0]BPCORD,[M:SOH4]ITMREF(nolign-1),"SOH4",nolign-1,[M:SOH4]VAT1(nolign-1)) From TRTX3
    Endif
    Gosub UPD_PREP_MESS From SUBSOHA1 # X3-246884 By SDEM
    End
    # 107890 : Scheduled invoices : (LD:08/12/15)
    # ------------------------------------ DINVCND ------------------------
    ######################################################################################
    Subprog IB_DINVCND
    
      If [M:SOH4]DINVCND(nolign-1)=""
        Raz GBOUT2
      Endif
    
    End
    ########################################
    Subprog AS_DINVCND(VALEUR)
    Variable Char    VALEUR()
    
    # Invoicing condition managed only for Normal order and not deliverable item
    # It is not accessible if the line is invoiced
    If [M:SOH0]SOHCAT<>1 | [M:SOH4]DLVFLG(nolign-1)<>1 | [M:SOH4]INVFLG(nolign-1)<>1
      mkstat=2
    Endif
    
    End
    ########################################
    Subprog C_DINVCND(VALEUR)
    Variable Char    VALEUR()
    
    # X3-200515 : Progress billing / X3-220424 : Blocking control on invoicing term update - 2020-11-03 by LD
    # If the line is associated to a billing plan, we can't modify the invoing term
    If dim([M:SOH4]PRGBILNUM)> 0 & [M:SOH4]PRGBILNUM(nolign-1)<>"" & VALEUR <> [M:SOH4]DINVCND(nolign-1)
        GMESSAGE = mess(602,192,1)-":"-func AFNC.MES1(mess(291,191,1),"")-[M:SOH4]PRGBILNUM(nolign-1) : mkstat=2 : End
    Endif
    # X3-200515 : Progress billing / X3-220424 : Blocking control on invoicing term update - 2020-11-03 by LD
    
    # Invoicing condition is mandatory for undeliverable item
    If [M:SOH4]DLVFLG(nolign-1)=1 & VALEUR=""
        mkstat=2 : Raz GMESSAGE
        If GIMPORT GMESSAGE=[M:SOH4]ITMREF(nolign-1)-":" Endif : GMESSAGE-=mess(864,197,1) : End
    Endif
    #--An existing invoice condition cannot be changed if at list one invoice condition line
    #--has a status different then "To be invoiced"
    Local File SVCRINVCNDD [SVICD]
    If find(GREP,"C","D")=0 and [M:SOH4]DINVCND(nolign-1)<>"" and [M:SOH4]DINVCND(nolign-1)<>VALEUR
      # X3-200515 : Progress billing / X3-222013 : Progress billing - general test - 2020-12-15 by LD
      # we can't modify the invoicing term on a line with scheduled invoices linked with a milestone
      If func TRTVENDIV.VERF_SVICD_PJTMST([M:SOH0]SOHNUM, [M:SOH4]SOPLIN(nolign-1), [M:SOH4]SOPLIN(nolign-1), GMESSAGE) = [V]CST_AERROR
          mkstat=2 : End
      Endif
      # X3-200515 : Progress billing / X3-222013 : Progress billing - general test - 2020-12-15 by LD
      Filter [SVICD] Where VCRTYP    = 10    and
    &                      VCRNUMORI = [M:SOH0]SOHNUM and
    &                      VCRLINORI = [M:SOH4]SOPLIN(nolign-1) and
    &                      VCRSEQORI = [M:SOH4]SOPLIN(nolign-1) and
    &                      INVCNDSTA > 1
      Read [SVICD] First
      If fstat=0
        Filter [SVICD]
        #--Message...
        #--"Already existing entry. Creation not suitable !"
        mkstat =2 : GMESSAGE = mess(500,192,1) #"L'échéancier est déjà généré et il contient des lignes facturées/soldées !"
      Endif
      Filter [SVICD]
    Endif
    End
    # 107890 : Scheduled invoices : (LD:08/12/15)
    ######################################################################################
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    Subprog AM_DINVCND(VALEUR)
    Variable Char    VALEUR()
    Local Integer WTRBEGIN,WOK
      #--The "C_DINVCND" done above will prevent changing an invoice condition if already invoiced lines
      #--If an existing invoice condition is code is changed, the new one will be generated and the existing deleted
      #--As the invoice condition is created into the database at the same time at the order,
      #--the rule only apply while modifying the order lien
      If [M:SOH4]DINVCND(nolign-1)<>VALEUR
        #--New invoice condition => we start from scratch
        If dim(GSOHVCRINVCND_UPD)>0 and GSOHVCRINVCND_UPD(nolign-1)<>null
          FreeGroup GSOHVCRINVCND_UPD(nolign-1)
          GSOHVCRINVCND_UPD(nolign-1)=null
        Endif
      Endif
      # Issue 107888 - 2016-09-09 by CPO : US155 Kit & flexible kit scheduled invoices
      #  If find(GREP,"C","D")=0 and [M:SOH4]DINVCND(nolign-1)<>"" and [M:SOH4]DINVCND(nolign-1)<>VALEUR
      #&                         and [M:SOH4]DINVCNDTODEL(nolign-1)=[V]CST_ANO
      If [M:SOH4]DINVCND(nolign-1)<>"" and [M:SOH4]DINVCND(nolign-1)<>VALEUR
    &                         and [M:SOH4]DINVCNDTODEL(nolign-1)=[V]CST_ANO
        If find(GREP,"C","D")=0
      # End issue 107888 US155
          GERR=0
          WOK=1
          Call AVERTIR(mess(490,192,1),WOK) From GESECRAN
          If WOK<2 : mkstat=2 : End : Endif
          #--Setting the "to delete" flag and filling the invoice condition code to be deleted
          [M:SOH4]DINVCNDTODEL(nolign-1)=[V]CST_AYES
          [M:SOH4]DINVCNDPREV (nolign-1)=[M:SOH4]DINVCND(nolign-1)
        # Issue 107888 - 2016-09-09 by CPO : US155 Kit & flexible kit scheduled invoices
        Else
          #--In this case, in LIBSAL_INVCND_SOH_BOM we need the flag to set the kit lines's invoice condition to the same value
          If [M:SOH4]LINTYP(nolign-1)=6
            [M:SOH4]DINVCNDUPDK(nolign-1)=[V]CST_AYES
          Endif
        Endif
        # End issue 107888 US155
      Endif
      #--Also, if the user re-fill the former value, we have to unset the "to delete" flag
      If VALEUR=[M:SOH4]DINVCNDPREV (nolign-1) and [M:SOH4]DINVCNDTODEL(nolign-1)=[V]CST_AYES
        [M:SOH4]DINVCNDTODEL(nolign-1)=[V]CST_ANO
        [M:SOH4]DINVCNDPREV (nolign-1)=""
        [M:SOH4]DINVCNDUPDK(nolign-1)=[V]CST_ANO # Issue 107888 - 2016-09-09 by CPO : US155 Kit & flexible kit scheduled invoices
      Endif
      [M:SOH4]DINVCNDTOUPD(nolign-1)=[V]CST_AYES #CPO 18/01/2016 Optimisation
      [M:SOH4]DINVCNDTODIS(nolign-1)=[V]CST_ANO  #CPO 18/01/2016 Thus, we only do it once after an order line modification
    End
    # End issue 107888
    
    # 139565 : Milestone billing / X3-185425 - 2020-03-19 by LD
    # ------------------------------------ DPJT------------------------
    # Issue X3-200515/X3-227027 - 2020-12-22 by SR : General tour : Raz Jum to button if ther is at least one progress billing or one Milestone linked.
    ######################################################################################
    Subprog IB_DPJT
    # for existing lines
    If [M:SOH4]CREFLG(nolign-1) <> 0
      Gosub INIT_JUMP_TO_DPJT From LIBSAL_INVCND_SOH
    Endif
    End
    # End issue X3-227027
    
    # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan  - 2020-07-16 by LD
    ######################################################################################
    Subprog C_DPJT(VALEUR)
    Variable Char    VALEUR()
    
    If VALEUR = [M:SOH4]DPJT(nolign-1) : End : Endif
    
    # If the line is associated to a billing plan, we can't modify the PJT code
    If dim([M:SOH4]PRGBILNUM)> 0 & [M:SOH4]PRGBILNUM(nolign-1)<>""
        GMESSAGE = mess(580,192,1)-":"-func AFNC.MES1(mess(291,191,1),"")-[M:SOH4]PRGBILNUM(nolign-1) : mkstat=2 : End
    Endif
    
    End
    # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan  - 2020-07-16 by LD
    ########################################
    Subprog AM_DPJT(VALEUR)
    Variable Char    VALEUR()
    Local Integer NOL : NOL=nolign-1
    
    If [M:SOH4]DINVCND(NOL)=""  End Endif
    # Il y a un échéancier : Il faut vérifier que les jalons liés aux lignes d'échéancier sont compatibles
    # Ctrl ssi code activité "PJM" actif (ctrl dans l'étiquette de ctrl)
    # There is a schedule invoice : We have to verify the linked milestone are compatible
    # Control only if "PJM" code activity active (Ctrl done in the label control
    If VALEUR="" End Endif
    
    # Ctrl ssi l'échéancier a été généré
    # Control only if schedule invoices have been generated
    If ([M:SOH4]CREFLG(NOL)<>0 | ([M:SOH4]CREFLG(NOL)=0 & dim(GSOHVCRINVCND_UPD)>0 & GSOHVCRINVCND_UPD(NOL)<>null))
        Local Integer WRET : Raz WRET
        Local Char WOLDPJT(GLONPJT) : WOLDPJT=[M:SOH4]DPJT(NOL)
        Local Char WNEWPJT(GLONPJT) : WNEWPJT=VALEUR
        Gosub CTL_PJT_COMPATIBILITY From SUBSOH1
        If WRET = [V]CST_AERROR mkstat=2 : End Endif
    Endif
    
    End
    # 139565 : Milestone billing / X3-185425 - 2020-03-19 by LD
    # ------------------------------------ REP1------------------------
    ########################################
    Subprog AM_REP1(VALEUR)    : # --- Web - Faible - Asynchrone
    Variable Char    VALEUR()
    # --> Initialisation taux commission 1
    If [M]CREFLG(nolign-1) <>0:End:Endif
    If VALEUR = "" : [M:SOH4]REPRAT1 (nolign-1) = 0:End:Endif
    If [F:BPC]BPCNUM <> [M:SOH0]BPCORD
        Read [F:BPC]BPC0 = [M:SOH0]BPCORD
        If fstat Raz [F:BPC] :Endif
    Endif
    Read [F:REP]REP0 = VALEUR
    If fstat=0
        If [F:BPC]COMCAT <> 0
            [M:SOH4]REPRAT1(nolign-1) = [F:REP]COMRAT1([F:BPC]COMCAT-1)
        Endif
    Endif
    End
    # ----------------------------------- REPRAT1 ------------------------
    Subprog AS_REPRAT1(VALEUR)
    Variable Decimal VALEUR
    
    # --> Pas de saisie si rep1 non renseigne
    If [M]REP1(nolign-1) = "" VALEUR = 0 : mkstat=2 Endif
    End
    # ------------------------------------ REP2 ------------------------
    Subprog AM_REP2(VALEUR)    : # --- Web - Faible - Asynchrone
    Variable Char    VALEUR()
    
    # --> Initialisation taux commission 2
    If [M]CREFLG(nolign-1) <> 0: End: Endif
    If VALEUR = "" : [M:SOH4]REPRAT2 (nolign-1) = 0:End:Endif
    If [F:BPC]BPCNUM <> [M:SOH0]BPCORD
        Read [F:BPC]BPC0 = [M:SOH0]BPCORD
        If fstat Raz [F:BPC] :Endif
    Endif
    Read [F:REP]REP0 = VALEUR
    If fstat=0
        If [F:BPC]COMCAT <> 0
            [M:SOH4]REPRAT2(nolign-1) = [F:REP]COMRAT2([F:BPC]COMCAT-1)
        Endif
    Endif
    End
    # ------------------------------------ REPRAT2 ------------------------
    Subprog AS_REPRAT2(VALEUR)
    Variable Decimal VALEUR
    # --> Pas de saisie si rep2 non renseigne
    If [M]REP2(nolign-1) = "" VALEUR = 0 : mkstat=2 Endif
    End
    # ------------------------------------ DDEMDLVDAT ------------------------
    ##########################################################################
    ## Etiquette ajoutée par le superviseur 19/11/2003 08:03:00 (LD)
    ##########################################################################
    Subprog C_DDEMDLVDAT(VALEUR)
    Variable Date    VALEUR
    Local    Integer NOL : NOL=nolign-1
    Local    Date    WDEMDLVDAT : WDEMDLVDAT=VALEUR
    
    # --> Vérification de la date de livraison demandée
    Call CTLUVYBPD(WDEMDLVDAT, [M:SOH4]DBPAADD(NOL), [M:SOH0]BPCORD, 0) From TRTVENCTL
    If mkstat=2
        Local Integer WOK : WOK=2
        Call AVERTIR(mess(496,197,1)-":"-format$(GFMDAT,WDEMDLVDAT)-":"-GMESSAGE, WOK) From GESECRAN :#--CPO 83985 GFMDAT au lieu de GFMD
        Raz GMESSAGE
        If WOK=1 : End : Endif
        mkstat=0
    Endif
    VALEUR=WDEMDLVDAT
    End
    ########################################
    Subprog AM_DDEMDLVDAT(VALEUR)
    Variable Date VALEUR
    Local Integer NOL : NOL=nolign-1
    
    # Controle lié à l'inter-site
    Gosub CTR_BETFCY From SUBSOHB : If mkstat=2 End Endif
    # Controle lié à la contremarque
    Gosub CTR_CTM From SUBSOHB : If mkstat=2 End Endif
    
    # --> Recalcul date expedition
    Call CALC_SHIDAT(VALEUR, [M:SOH4]DDAYLTI(NOL), [M:SOH4]DSTOFCY(NOL), 1, 1,[M:SOH0]ORDDAT, [M:SOH4]DSHIDAT(NOL)) From TRTVENDAT
    #If mkstat Call MESSAGE (mess(278,192,1)-format$(GFMD,[M:SOH4]DSHIDAT(NOL))-"\"-GMESSAGE) From GESECRAN : Endif
    mkstat=0
    # --> Recalcul date de livraison prévue
    Call CALC_DLVDAT([M:SOH4]DSHIDAT(NOL), [M:SOH4]DDAYLTI(NOL), [M:SOH4]DBPAADD(NOL), [M:SOH0]BPCORD, 0,0,
    &             [M:SOH4]EXTDLVDAT(NOL)) From TRTVENDAT
    #If mkstat Call MESSAGE (mess(279,192,1)-format$(GFMD,[M:SOH4]EXTDLVDAT(NOL))-"\"-GMESSAGE) From GESECRAN : Endif
    mkstat=0
    If func AFNC.ACTIV("EDIX3")>0: Gosub CTL_CHGMAXDLVDAT From TRTFLDEDI: Endif #SAM 110881
    Affzo [M]DSHIDAT(NOL), EXTDLVDAT(NOL)
    
    End
    # ------------------------------------ DDAYLTI ------------------------
    ########################################
    Subprog AM_DDAYLTI(VALEUR)
    Variable Decimal VALEUR
    Local Integer NOL : NOL=nolign-1
    
    # 105605 : CCM - Revision index (LD:18/06/15)
    #If find([M:SOH4]FMI(NOL),2,3,5) & [M:SOH4]FMINUM(NOL) <> ""
    #    Local Integer OK  : OK=2
    #    Call AVERTIR(mess(52,191,1),OK) From GESECRAN
    #    If OK <> 2 mkstat=2 : End : Endif
    #Endif
    # Controle lié à la contremarque
    Gosub CTR_CTM From SUBSOHB : If mkstat=2 End Endif
    # 105605 : CCM - Revision index (LD:18/06/15)
    
    # --> Recalcul date expedition
    Call CALC_SHIDAT([M:SOH4]DDEMDLVDAT(NOL), VALEUR,[M:SOH4]DSTOFCY(NOL),1,1,[M:SOH0]ORDDAT, [M:SOH4]DSHIDAT(NOL)) From TRTVENDAT
    #If mkstat Call MESSAGE (mess(278,192,1)-format$(GFMD,[M:SOH4]DSHIDAT(NOL))-"\"-GMESSAGE) From GESECRAN : Endif
    # --> Recalcul date liv prevue
    Call CALC_DLVDAT([M:SOH4]DSHIDAT(NOL), VALEUR, [M:SOH4]DBPAADD(NOL), [M:SOH0]BPCORD, 0,0,
    &             [M:SOH4]EXTDLVDAT(NOL)) From TRTVENDAT
    #If mkstat Call MESSAGE (mess(279,192,1)-format$(GFMD,[M:SOH4]EXTDLVDAT(NOL))-"\"-GMESSAGE) From GESECRAN : Endif
    Affzo [M]DSHIDAT(NOL), EXTDLVDAT(NOL)
    End
    # ------------------------------------ DSHIDAT ------------------------
    ##########################################################################
    ## Etiquette ajoutée par le superviseur 17/02/2004 16:50:39 (LD)
    ##########################################################################
    Subprog C_DSHIDAT(VALEUR)
    Variable Date    VALEUR
    Local    Integer NOL : NOL=nolign-1
    
    If VALEUR >  [M:SOH4]EXTDLVDAT(NOL)
        Local Integer WOK : WOK=2
        Call AVERTIR (mess(33,192,1), WOK) From GESECRAN : Raz GMESSAGE
        If WOK=1 mkstat=2 : End : Endif
    Endif
    End
    ########################################
    Subprog AM_DSHIDAT(VALEUR)
    Variable Date    VALEUR
    Local Integer NOL : NOL=nolign-1
    
    Local Integer WOK  : WOK=2
    If find([M:SOH4]FMI(NOL),2,3,5) & [M:SOH4]FMINUM(NOL) <> ""
        Call AVERTIR(mess(52,191,1),WOK) From GESECRAN
        If WOK <> 2 mkstat=2 : End : Endif
    Endif
    # --> Recalcul date liv prevue
    Call CALC_DLVDAT(VALEUR, [M:SOH4]DDAYLTI(NOL), [M:SOH4]DBPAADD(NOL),[M:SOH0]BPCORD, 0, 0,
    &             [M:SOH4]EXTDLVDAT(NOL)) From TRTVENDAT
    #If mkstat Call MESSAGE (mess(279,192,1)-format$(GFMD,[M:SOH4]EXTDLVDAT(NOL))-"\"-GMESSAGE) From GESECRAN : Endif
    # --> Recadrage de la date d'expédition par rapport à la date liv prevue qui vient d'être calculée
    Local Date WDSHIDAT
    Call CALC_SHIDAT([M:SOH4]EXTDLVDAT(NOL), [M:SOH4]DDAYLTI(NOL), [M:SOH4]DSTOFCY(NOL), 1, 1, [M:SOH0]ORDDAT, WDSHIDAT) From TRTVENDAT
    mkstat=0 : Raz GMESSAGE
    If VALEUR<>WDSHIDAT
        #--CPO 83985 GFMDAT au lieu de GFMD
        Call OUINON(mess(154,191,1)-format$(GFMDAT,[M]EXTDLVDAT(NOL))-":\"-mess(155,191,1)-format$(GFMDAT,[M]EXTDLVDAT(NOL))-"-"-num$([M]DDAYLTI(NOL))-mess(38,104,1), WOK) From GESECRAN
        If WOK=2 VALEUR=WDSHIDAT Endif
    Endif
    
    Affzo [M:SOH4]EXTDLVDAT(NOL)
    End
    #----------------------------------- EXTDLVDAT ---------------------
    ########################################
    Subprog C_EXTDLVDAT(VALEUR)
    Variable Date    VALEUR
    Local    Integer NOL : NOL = nolign-1
    
    Local    Date    WEXTDLVDAT : WEXTDLVDAT=VALEUR
    Local    Integer WOK : WOK=2
    # --> Vérification de la date de livraison prévue
    Call CTLUVYBPD(WEXTDLVDAT, [M:SOH4]DBPAADD(NOL), [M:SOH0]BPCORD, 0) From TRTVENCTL
    If mkstat=2
        Call AVERTIR(mess(497,197,1)-":"-format$(GFMDAT,WEXTDLVDAT)-":"-GMESSAGE, WOK) From GESECRAN :#--CPO 83985 GFMDAT au lieu de GFMD
        Raz GMESSAGE
        If WOK=1 : End : Endif
        mkstat=0
    Endif
    VALEUR=WEXTDLVDAT
    If VALEUR < [M:SOH4]DSHIDAT(NOL) GMESSAGE=mess(47,192,1) : mkstat=2 : Endif
    End
    ########################################
    Subprog AM_EXTDLVDAT(VALEUR)
    Variable Date    VALEUR
    Local    Integer NOL : NOL = nolign-1
    
    Local    Integer WOK : WOK=2
    # --> Controle date livraison prévue >= date expédition
    If VALEUR < [M:SOH4]DSHIDAT(NOL)
        Call AVERTIR(mess(47,192,1), WOK) From GESECRAN
        If WOK=1 mkstat=2 : End : Endif
    Endif
    # --> Controle lié à la contremarque
    Gosub CTR_CTM From SUBSOHB
    If mkstat End : Endif
    # --> Recadrage de la date d'expédition par rapport à la date liv prevue
    Local Date WDSHIDAT : WDSHIDAT=[M:SOH4]DSHIDAT(NOL)
    Call CALC_SHIDAT(VALEUR, [M:SOH4]DDAYLTI(NOL), [M:SOH4]DSTOFCY(NOL), 1, 1, [M:SOH0]ORDDAT, WDSHIDAT) From TRTVENDAT
    mkstat=0 : Raz GMESSAGE
    If [M:SOH4]DSHIDAT(NOL)<>WDSHIDAT
        :#--CPO 83985 GFMDAT au lieu de GFMD
        Call OUINON(mess(154,191,1)-format$(GFMDAT,VALEUR)-":\"-mess(155,191,1)-format$(GFMDAT,VALEUR)-"-"-num$([M]DDAYLTI(NOL))-mess(38,104,1), WOK) From GESECRAN
        If WOK=2 [M:SOH4]DSHIDAT(NOL)=WDSHIDAT : Affzo [M:SOH4]DSHIDAT(NOL) : Endif
    Endif
    
    End
    # -------------------------------------- TDLQTY -------------------------
    ########################################
    Subprog AS_TDLQTY(VALEUR)
    Variable Decimal VALEUR
    Local    Integer NOL : NOL = nolign-1
    ## 107890: Scheduled invoices: (LC:28/10/16)
    If [M:SOH4]DLVFLG(nolign-1)<>2 & [M:SOH0]SOHCAT=1
       mkstat=2
       End
    Endif
    ## 107890: Scheduled invoices: (LC:28/10/16)
    # Pas de saisie si article géré en stock
    If [M:SOH4]STOMGTCOD(NOL)<>1 | find([M:SOH4]LINTYP(NOL),2,3,4,5,10,11,12,13) | [M:SOH4]CONNUM(NOL)<>""
       mkstat=2 : End
    Endif
    If [F:ITM]ITMREF <> [M:SOH4]ITMREF(NOL)
        Read [F:ITM]ITM0 = [M:SOH4]ITMREF(NOL)
        If fstat  Raz [F:ITM] : Endif
    Endif
    # Pas de saisie si article contrat
    If [F:ITM]TPLCONSRV <> "" mkstat=2 : End : Endif
    End
    ########################################
    Subprog C_TDLQTY(VALEUR)
    Variable Decimal VALEUR
    Local Integer NOL
    Local Decimal WRESTE, WQTY
    NOL=nolign-1
    If [M:SOH4]STOMGTCOD(nolign-1)<>1 Raz VALEUR : End Endif
    
    # Calcul du reste à livrer : Préparé + déjà livré
    WQTY = [M:SOH4]OPRQTY(NOL)+[M:SOH4]PREQTY(NOL)+[M:SOH4]ODLQTY(NOL)
    # 107888 : Scheduled invoices : (LD:19/05/16)
    # Commande à facturation directe
    # Commande normale/prêt et ligne non livrable
    # Pour le reste à livrer, on prend compte la qté facturée validée
    #If [M]SOHCAT=3
    If [M]SOHCAT=3 | [M]DLVFLG(NOL)=1
        WRESTE = [M:SOH4]QTY(NOL)-WQTY-[M:SOH4]INVQTY(NOL)
    Else
    # Commande normale/prêt et ligne livrable
    # Pour le reste à livrer, on prend compte la qté livrée validée
        WRESTE = [M:SOH4]QTY(NOL)-WQTY-[M:SOH4]DLVQTY(NOL)
    Endif
    # 107888 : Scheduled invoices : (LD:19/05/16)
    
    # Qté à livrer > qté restant à livrer!
    If VALEUR > WRESTE
       GERR=2 : GMESSAGE=mess(89,191,1)
    Endif
    End
    # -------------------------------------- DBPAADD ------------------------
    ########################################
    Subprog AS_DBPAADD(VALEUR)    : # --- Web - Obligatoire - Synchrone
    Variable Char    VALEUR()
    Raz GMESSAGE
    If GLINBPD <> 2 mkstat=2 Endif
    # --> Zone non modifiable si livraison commande complète
    If [M:SOH2]DME = 3 mkstat = 2 : Endif
    End
    ########################################
    Subprog C_DBPAADD(VALEUR)
    Variable Char    VALEUR()
    Local Integer NOL : NOL=nolign-1
    
    # X3-69134 : Performance enhancements for sales order import / X3-74049  : Restricted prices (LD:05/29/18)
    # This has to be done only if DBPAADD has changed
    If VALEUR<>[M:SOH4]DBPAADD(NOL)
    # X3-69134 : Performance enhancements for sales order import / X3-74049  : Restricted prices (LD:05/29/18)
        # 79705 : SAT in SPRICLINK : Step 2
        # Recherche interdit suite modification de l'adresse
        Local Char    WREP (GLONREP)
        Local Char    WBPAADD (GLONBPD)
        If dim([M:SOH4]REP1(NOL)) > 0
          WREP=[M:SOH4]REP1(NOL)
          If GLINREP=2
              # Alimentation des représentants s'ils n'ont pas été alimentés par le client commande
              If [F:BPC]BPCNUM <> [M:SOH0]BPCORD
                  Read [BPC]BPC0 = [M:SOH0]BPCORD
                  If fstat <> 0 Raz [F:BPC] : Endif
              Endif
              # Alimentation du 1er représentant
              If [F:BPC]REP(0) = ""
                  If [F:BPD]BPCNUM <> [M:SOH0]BPCORD | [F:BPD]BPAADD <> VALEUR
                      Read [F:BPD]BPD0 = [M:SOH0]BPCORD;VALEUR
                      If fstat Raz [F:BPD] Endif
                  Endif
                  WREP= [F:BPD]REP(0)
              Endif
          Endif
        Endif
    
        WBPAADD=[M:SOH4]DBPAADD(NOL)
        [M:SOH4]DBPAADD(NOL)=VALEUR : # Il faut affecter le champ pour que la recherche tarif ait la bonne valeur
        Call RECH_INTERDIT ([M:SOH4]ITMREF(NOL), VALEUR, WREP, 2) From TRTVENTAR
        If mkstat=2 & GDACLOK=2
            Local Integer WOK
            WOK=2 : Call AVERTIR (mess(27,192,1)-":"-mess(205,100,1), WOK) From GESECRAN
            If WOK=2 mkstat=0 Endif
            Raz GMESSAGE
        Endif
        If mkstat = 2 [M:SOH4]DBPAADD(NOL)=WBPAADD : End : Endif
        # 79705 : SAT in SPRICLINK : Step 2
    # X3-69134 : Performance enhancements for sales order import / X3-74049  : Restricted prices (LD:05/29/18)
    Endif
    # X3-69134 : Performance enhancements for sales order import / X3-74049  : Restricted prices (LD:05/29/18)
    
    # Si commande de prêt, contrôle de l'emplacement client
    # On autorise le passage car il se peut que l'adresse ne soit pas saisissable
    If [M:SOH0]SOHCAT = 2 & GMODU(7)=2
       If !clalev ([F:STC]) Local File STOLOC [STC] Endif
       Read [STC]STC0=[M:SOH4]DSTOFCY(nolign-1);[F:BPD]BPCLOC
       If fstat
          mkstat=2 : GMESSAGE = mess(117,192,1)
    # <MG> 31/01/01
       Elsif [F:STC]LOCCAT <> 3
          mkstat=2 : GMESSAGE = mess(118,192,1)
       Endif
    Endif
    If mkstat=2 End Endif
    # BPAADD rendu non modifiable pour l'instant
    # Commande inter-site avec commande d'achat réciproque
    #If [M:SOH1]BETFCY=2 & [M:SOH0]ORIFCY<>""
    #    Local Char LPRHFCY
    #    Call RECPRHFCY([M:SOH0]BPCORD, VALEUR, LPRHFCY) From TRTVENISOC
    #    If GERR=1 mkstat=2 : End : Endif
    #Endif
    # Si cde inter-site : Ctrl existence article-site sur le site de réception
    #                     ssi article géré en stock réceptionné
    #                     (Pour la maj stock en transit à la sortie des stocks)
    If [M:SOH1]BETFCY=2 & [M:SOH0]SOHCAT<>3 & [F:BPD]RCPFCY<>""
        If [F:ITM]ITMREF <> [M:SOH4]ITMREF(NOL)
            Read [F:ITM]ITM0 = [M:SOH4]ITMREF(NOL)
            If fstat  Raz [F:ITM] : Endif
        Endif
        If [F:ITM]RCPFLG=2
            Call CONTITF([M:SOH4]ITMREF(NOL), [F:BPD]RCPFCY, [F:ITM]STOMGTCOD) From TRTVENCTL
            If mkstat=2 GMESSAGE = mess(74,187,1)-":"-mess(293,192,1)-[F:BPD]RCPFCY : End Endif
        Endif
    Endif
    
    # Vérif.cohérence entre l'entête cde et le client livré concernant les infos douanières et le régime de taxe
    If VALEUR<>[M:SOH1]BPAADD
        # Bug 72213 : Initialisation du N°TVA depuis client livré ou client facture
        If dim([M:SOH0]BPIEECNUM)>0
          Local Char WEECNUM(20)
          Call INIEECNUM ([M:SOH0]BPCORD,VALEUR,[M:SOH1]BPCINV,WEECNUM,[M:SOH0]EECNUMCRY) From TRTVENDIV
        Endif
        # Bug 72213
        If [M:SOH1]VACBPR<>[F:BPD]VACBPR & [F:BPD]VACBPR<>""
            # Régime de taxe client livré XXX différent du régime de taxe entête commande YYY
            # A la dde de CH, le ctrl n'est plus bloquant
            GMESSAGE=mess(620,197,1)-mess(42,191,1)-"("-[F:BPD]VACBPR-")"-mess(621,197,1)-mess(620,197,1)-mess(622,197,1)-mess(191,198,1)-"("-[M:SOH1]VACBPR-")"
            Local Integer OK : OK=2 : Call AVERTIR(GMESSAGE, OK) From GESECRAN : Raz GMESSAGE : If OK=1 mkstat=2 Endif
        Elsif dim([M:SOH0]BPIEECNUM)>0 & [M:SOH0]BPIEECNUM<>WEECNUM & WEECNUM<>""                                                                                     : # Bug 72213
            #FQ 55836 - Le ctrl ne doit plus être bloquant
            #mkstat=2 : # N°identification CEE client livré XXX différent du N°identification CEE entête devis
            GMESSAGE=mess(629,197,1)-mess(42,191,1)-"("-WEECNUM-")"-mess(621,197,1)-mess(629,197,1)-mess(622,197,1)-mess(191,198,1)-"("-[M:SOH0]BPIEECNUM-")"   : # Bug 72213
            Local Integer OK : OK=2 : Call AVERTIR(GMESSAGE, OK) From GESECRAN : Raz GMESSAGE : If OK=1 mkstat=2 Endif
            #fin FQ 55836
        Elsif [M:SOH0]EECICT<>[F:BPD]EECICT & [F:BPD]EECICT<>""
            #FQ 55836 - Le ctrl ne doit plus être bloquant
            #mkstat=2 : # Code incoterm client livré XXX différent du code incoterm entête devis
            GMESSAGE=mess(630,197,1)-mess(42,191,1)-"("-[F:BPD]EECICT-")"-mess(621,197,1)-mess(630,197,1)-mess(622,197,1)-mess(191,198,1)-"("-[M:SOH0]EECICT-")"
            Local Integer OK : OK=2 : Call AVERTIR(GMESSAGE, OK) From GESECRAN : Raz GMESSAGE : If OK=1 mkstat=2 Endif
            #fin FQ 55836
        Elsif dim([M:SOH0]EECLOC)>0 & [M:SOH0]EECLOC<>[F:BPD]EECLOC & [F:BPD]EECLOC<>0
            #FQ 55836 - Le ctrl ne doit plus être bloquant
            #mkstat=2 : # Lieu transport CEE client livré XXX différent du Lieu transport CEE entête devis
            GMESSAGE=mess(631,197,1)-mess(42,191,1)-"("-mess([F:BPD]EECLOC,236,1)-")"-mess(621,197,1)-mess(631,197,1)-mess(622,197,1)-mess(191,198,1)-"("-mess([M:SOH0]EECLOC,236,1)-")"
            Local Integer OK : OK=2 : Call AVERTIR(GMESSAGE, OK) From GESECRAN : Raz GMESSAGE : If OK=1 mkstat=2 Endif
            #fin FQ 55836
        Endif
    Endif
    
    End
    ########################################
    Subprog AM_DBPAADD(VALEUR)
    Variable Char VALEUR()
    Local Integer NOL : NOL=nolign-1
    Local Integer OK  : OK=2
    Local Date    WDEMDLVDAT
    # --> Vérification de la date de livraison demandée pour la nouvelle adresse de livraison
    WDEMDLVDAT=[M:SOH4]DDEMDLVDAT(NOL)
    Call CTLUVYBPD(WDEMDLVDAT, VALEUR, [M:SOH0]BPCORD, 0) From TRTVENCTL
    If mkstat=2 Call AVERTIR(mess(496,197,1)-":"-format$(GFMDAT,WDEMDLVDAT)-"\"-GMESSAGE, OK) From GESECRAN Endif :#--CPO 83985 GFMDAT au lieu de GFMD
    Raz GMESSAGE : If OK=1 : End : Endif
    mkstat=0
    If [M:SOH4]DDAYLTI(NOL)<>[F:BPD]DAYLTI
        If [M:SOH4]FMINUM(NOL) <> ""
            Call AVERTIR(mess(20,191,1)+"\"+mess(52,191,1),OK) From GESECRAN
            If OK <> 2 mkstat=2 : End : Endif
        Else
            Call MESSAGE(mess(20,191,1)) From GESECRAN
        Endif
        # --> Recalcul date expedition
        Call CALC_SHIDAT([M:SOH4]DDEMDLVDAT(NOL), [F:BPD]DAYLTI, [M:SOH4]DSTOFCY(NOL), 1, 1,
    &                    [M:SOH0]ORDDAT, [M:SOH4]DSHIDAT(NOL))   From TRTVENDAT
        If mkstat Call MESSAGE (mess(278,192,1)-format$(GFMDAT,[M:SOH4]DSHIDAT(NOL))-"\"-GMESSAGE) From GESECRAN : Endif :#--CPO 83985 GFMDAT au lieu de GFMD
        # --> Recalcul date liv prévue
        Call CALC_DLVDAT([M:SOH4]DSHIDAT(NOL), [F:BPD]DAYLTI, VALEUR, [M:SOH0]BPCORD, 0,0,
    &                    [M:SOH4]EXTDLVDAT(NOL)) From TRTVENDAT
        If mkstat Call MESSAGE (mess(279,192,1)-format$(GFMDAT,[M:SOH4]EXTDLVDAT(NOL))-"\"-GMESSAGE) From GESECRAN : Endif :#--CPO 83985 GFMDAT au lieu de GFMD
    Endif
    # Initialisations de zone à faire dans tous les cas
    [M:SOH4]DDLVPIO(NOL) = [F:BPD]DLVPIO
    [M:SOH4]DDAYLTI(NOL) = [F:BPD]DAYLTI
    [M:SOH4]DMDL(NOL)    = [F:BPD]MDL
    [M:SOH4]DDRN(NOL)    = [F:BPD]DRN
    [M:SOH4]DBPTNUM(NOL) = [F:BPD]BPTNUM
    # Recherche s'il y a un contact pour l'adresse de livraison
    Call RECH_CNTNAM([M:SOH0]BPCORD, [F:BPD]BPAADD, [M:SOH4]CNDNAM(NOL)) From TRTVENDIV
    
    If GLINREP=2
        # Alimentation des représentants s'ils n'ont pas été alimentés par le client commande
        If [F:BPC]BPCNUM <> [M:SOH0]BPCORD
            Read [BPC]BPC0 = [M:SOH0]BPCORD
            If fstat <> 0 Raz [F:BPC] : Endif
        Endif
        # Alimentation du 1er représentant
        If dim([M:SOH4]REP1) > 0 & [F:BPC]REP(0) = ""
            [M:SOH4]REP1(NOL)= [F:BPD]REP(0)
            If [F:REP]REPNUM <> [F:BPD]REP(0)
                Read [F:REP]REP0 = [F:BPD]REP(0)
                If fstat Raz [F:REP] : Endif
            Endif
            If [F:BPC]COMCAT <> 0 [M:SOH4]REPRAT1(NOL)=[F:REP]COMRAT1([F:BPC]COMCAT-1) : Endif
            Affzo [M:SOH4]REP1(NOL), REPRAT1(NOL)
        Endif
        # Alimentation du 2eme représentant
        If dim([M:SOH4]REP2) > 0
            If [M:SOH4]REP1(NOL)<>"" & [F:BPC]REP(1) = ""
                [M:SOH4]REP2(NOL) = [F:BPD]REP(1)
                If [F:REP]REPNUM <> [F:BPD]REP(1)
                    Read [F:REP]REP0 = [F:BPD]REP(1)
                    If fstat Raz [F:REP] : Endif
                Endif
                If [F:BPC]COMCAT <> 0 [M:SOH4]REPRAT2(NOL)=[F:REP]COMRAT2([F:BPC]COMCAT-1) : Endif
                Affzo [M:SOH4]REP2(NOL), REPRAT2(NOL)
            Endif
        Endif
    Endif
    
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #--Changing the adress or due to the price search, the invoice schedule has to be updated
    If [M:SOH4]DINVCND(NOL)<>"" and [M:SOH4]DBPAADD(NOL)<>VALEUR #CPO 18/01/2016 : and [M:SOH4]DBPAADD(NOL)<>""
      [M:SOH4]DINVCNDTOUPD(NOL)=[V]CST_AYES
      [M:SOH4]DINVCNDTODIS(NOL)=[V]CST_AYES #CPO 18/01/2016 Thus, we only do it once after an order line modification
      #--Here it is to early to call the redispatch for the global invoice condition schedule associated to the line
      #--It will be done in "after line" action on P1_NBLIG
    Endif
    # End issue 107888
    
    Affzo [M:SOH4]CNDNAM(NOL), DDLVPIO(NOL),DDAYLTI(NOL),DMDL(NOL)
    Affzo [M:SOH4]DSHIDAT(NOL),EXTDLVDAT(NOL),DBPTNUM(NOL)
    
    End
    # ---------------------------------- CNDNAM ------------------------
    ########################################
    Subprog C_CNDNAM(VALEUR)
    Variable Char    VALEUR()
    If VALEUR <> ""
        If clalev([F:CNT]) = 0 Local File CONTACT    [CNT] : Endif
        Read [CNT] CNT0=1;[M]BPCORD;VALEUR
        If fstat GMESSAGE = mess(23,100,1) : mkstat=2 : Endif
    Endif
    End
    # ---------------------------------- DDLVPIO ------------------------
    ########################################
    Subprog AS_DDLVPIO(VALEUR)
    Variable Integer VALEUR
    Raz GMESSAGE
    # --> Zone non modifiable si livraison commande complète
    If [M:SOH2]DME = 3 mkstat = 2 Endif
    End
    ########################################
    Subprog AM_DDLVPIO(VALEUR)
    Variable Integer VALEUR
    If [M]WIPFLG(nolign-1) = "" [M]WIPFLG(nolign-1) = "M" : Endif
    End
    # ------------------------------------ DMDL ------------------------
    ########################################
    Subprog AS_DMDL(VALEUR)
    Variable Char    VALEUR()
    Raz GMESSAGE
    # --> Zone non modifiable si livraison commande complète
    If [M:SOH2]DME = 3 mkstat = 2  : Endif
    End
    # ----------------------------------- DBPTNUM ------------------------
    ########################################
    Subprog AS_DBPTNUM(VALEUR)
    Variable Char    VALEUR()
    Raz GMESSAGE
    # --> Zone non modifiable si livraison commande complète
    If [M:SOH2]DME = 3 mkstat = 2 : Endif
    End
    # ------------------------------------ PCK ------------------------
    ##########################################################################
    ## Etiquette ajoutée par le superviseur 24/06/2004 10:16:18 (LD)
    ##########################################################################
    Subprog AM_PCK(VALEUR)
    Variable Char    VALEUR()
    Local    Integer NOL : NOL = nolign-1
    
    #CPO 63410
    #If VALEUR="" Raz [M:SOH4]PCKCAP(NOL)  : Affzo [M:SOH4]PCKCAP(NOL)  Endif
    If VALEUR=""
      Raz [M:SOH4]PCKCAP(NOL)
    Else
      Call AMPCK([M:SOH4]ITMREF(NOL),[M:SOH4]DSTOFCY(NOL),[M:SOH4]SAU(NOL),VALEUR,[M:SOH4]PCKCAP(NOL)) From TRTVENDIV
    Endif
    
    Affzo [M:SOH4]PCKCAP(NOL)
    
    End
    ##########################################################################
    
    ######################################################################################
    ## Etiquette ajoutée par le superviseur (écran SOH4) 17/07/2006 16:48:46 (LD)
    ######################################################################################
    Subprog D_CCE1(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=1 : Gosub D_CCEX
    End
    
    Subprog AS_CCE1(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=1 : Gosub AS_CCEX
    End
    
    Subprog C_CCE1(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=1 : Gosub C_CCEX
    End
    
    Subprog D_CCE2(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=2 : Gosub D_CCEX
    End
    
    Subprog AS_CCE2(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=2 : Gosub AS_CCEX
    End
    
    Subprog C_CCE2(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=2 : Gosub C_CCEX
    End
    
    Subprog D_CCE3(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=3 : Gosub D_CCEX
    End
    
    Subprog AS_CCE3(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=3 : Gosub AS_CCEX
    End
    
    Subprog C_CCE3(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=3 : Gosub C_CCEX
    End
    
    Subprog D_CCE4(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=4 : Gosub D_CCEX
    End
    
    Subprog AS_CCE4(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=4 : Gosub AS_CCEX
    End
    
    Subprog C_CCE4(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=4 : Gosub C_CCEX
    End
    
    Subprog D_CCE5(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=5 : Gosub D_CCEX
    End
    
    Subprog AS_CCE5(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=5 : Gosub AS_CCEX
    End
    
    Subprog C_CCE5(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=5 : Gosub C_CCEX
    End
    
    Subprog D_CCE6(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=6 : Gosub D_CCEX
    End
    
    Subprog AS_CCE6(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=6 : Gosub AS_CCEX
    End
    
    Subprog C_CCE6(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=6 : Gosub C_CCEX
    End
    
    Subprog D_CCE7(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=7 : Gosub D_CCEX
    End
    
    Subprog AS_CCE7(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=7 : Gosub AS_CCEX
    End
    
    Subprog C_CCE7(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=7 : Gosub C_CCEX
    End
    
    Subprog D_CCE8(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=8 : Gosub D_CCEX
    End
    
    Subprog AS_CCE8(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=8 : Gosub AS_CCEX
    End
    
    Subprog C_CCE8(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=8 : Gosub C_CCEX
    End
    
    Subprog D_CCE9(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=9 : Gosub D_CCEX
    End
    
    Subprog AS_CCE9(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=9 : Gosub AS_CCEX
    End
    
    Subprog C_CCE9(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=9 : Gosub C_CCEX
    End
    
    Subprog D_CCE10(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=10 : Gosub D_CCEX
    End
    
    Subprog AS_CCE10(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=10 : Gosub AS_CCEX
    End
    
    Subprog C_CCE10(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=10 : Gosub C_CCEX
    End
    
    Subprog D_CCE11(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=11 : Gosub D_CCEX
    End
    
    Subprog AS_CCE11(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=11 : Gosub AS_CCEX
    End
    
    Subprog C_CCE11(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=11 : Gosub C_CCEX
    End
    
    Subprog D_CCE12(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=12 : Gosub D_CCEX
    End
    
    Subprog AS_CCE12(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=12 : Gosub AS_CCEX
    End
    
    Subprog C_CCE12(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=12 : Gosub C_CCEX
    End
    
    Subprog D_CCE13(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=13 : Gosub D_CCEX
    End
    
    Subprog AS_CCE13(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=13 : Gosub AS_CCEX
    End
    
    Subprog C_CCE13(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=13 : Gosub C_CCEX
    End
    
    Subprog D_CCE14(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=14 : Gosub D_CCEX
    End
    
    Subprog AS_CCE14(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=14 : Gosub AS_CCEX
    End
    
    Subprog C_CCE14(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=14 : Gosub C_CCEX
    End
    
    Subprog D_CCE15(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=15 : Gosub D_CCEX
    End
    
    Subprog AS_CCE15(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=15 : Gosub AS_CCEX
    End
    
    Subprog C_CCE15(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=15 : Gosub C_CCEX
    End
    
    Subprog D_CCE16(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=16 : Gosub D_CCEX
    End
    
    Subprog AS_CCE16(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=16 : Gosub AS_CCEX
    End
    
    Subprog C_CCE16(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=16 : Gosub C_CCEX
    End
    
    Subprog D_CCE17(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=17 : Gosub D_CCEX
    End
    
    Subprog AS_CCE17(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=17 : Gosub AS_CCEX
    End
    
    Subprog C_CCE17(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=17 : Gosub C_CCEX
    End
    
    Subprog D_CCE18(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=18 : Gosub D_CCEX
    End
    
    Subprog AS_CCE18(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=18 : Gosub AS_CCEX
    End
    
    Subprog C_CCE18(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=18 : Gosub C_CCEX
    End
    
    Subprog D_CCE19(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=19 : Gosub D_CCEX
    End
    
    Subprog AS_CCE19(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=19 : Gosub AS_CCEX
    End
    
    Subprog C_CCE19(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=19 : Gosub C_CCEX
    End
    
    Subprog D_CCE20(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=20 : Gosub D_CCEX
    End
    
    Subprog AS_CCE20(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=20 : Gosub AS_CCEX
    End
    
    Subprog C_CCE20(VALEUR)
    Variable Char    VALEUR()
    Local    Integer AXE : AXE=20 : Gosub C_CCEX
    End
    
    $D_CCEX
    #------------------------------------#
    # Initialisation commune aux 20 axes #
    #------------------------------------#
    If AXE>GNBDIE Return : Endif
    Call INIT_CCE(VALEUR,AXE,"SOP","",0) From TRTX3CPT
    Return
    
    $AS_CCEX
    #----------------------------------#
    # Avant saisie commune aux 20 axes #
    #----------------------------------#
    
    # X3-69134 : Performance enhancements for sales order import : X3-74053 : Analytical dimensions management (LD:05/29/18)
    If AXE>GNBDIE Return : Endif
    # X3-69134 : Performance enhancements for sales order import : X3-74053 : Analytical dimensions management (LD:05/29/18)
    
    Call SAIS_CCE(VALEUR,AXE,"","") From TRTX3CPT
    Return
    
    $C_CCEX
    #-----------------------------#
    # Contrôle commun aux 20 axes #
    #-----------------------------#
    
    # X3-69134 : Performance enhancements for sales order import : X3-74053 : Analytical dimensions management (LD:05/29/18)
    If AXE>GNBDIE Return : Endif
    # X3-69134 : Performance enhancements for sales order import : X3-74053 : Analytical dimensions management (LD:05/29/18)
    
    Call CTRL_CCE(VALEUR,AXE,"",GFINRSP,[M:SOH0]ORDDAT) From TRTX3CPT
    #--CPO 74669 Import de commandes et contrôle sections (+modif obj SOH)
    If GIMPORT & mkstat
      GMESSAGE-="-"-mess(18,197,1)-num$(nolign)-mess(80,197,1)-[M:SOH4]ITMREF(nolign-1)
    Endif
    #--CPO
    Return
    ######################################################################################
    # ------------------------------------ DEMSTA ------------------------
    ########################################
    Subprog AS_DEMSTA(VALEUR)    : # --- Web - Obligatoire - Synchrone
    Variable Integer VALEUR
    Local    Integer NOL     : NOL=nolign-1
    Raz GMESSAGE
    # --> Zone non modifiable si contremarque ou ordre de production(forcement du ferme)
    If find([M:SOH4]FMI(NOL),2,3,5) mkstat = 2 : Endif
    
    # --> Zone non modifiable si il y a des allocations / préparations / livraisons / factures
    #If [M]ALLQTY(NOL)<>0 | [M]SHTQTY(NOL)<>0 | [M]ODLQTY(NOL)<>0 | [M]DLVQTY(NOL)<>0 | [M]INVQTY(NOL)<>0
    If [M]TALLQTY(NOL)<>0 | [M]SHTQTY(NOL)<>0 | [M]LPRQTY(NOL)<>0 mkstat = 2 Endif
    If mkstat=2 : End : Endif
    # --> On autorise uniquement les CF et CP
    For I=3 To 4:GMENLOC(I)=1:Next I
    End
    ########################################
    Subprog AM_DEMSTA(VALEUR)
    Variable Integer VALEUR
    Local Integer NOL : NOL=nolign-1
    # Il y a des nouvelles allocations
    If [M]WALLQTYSTU(NOL)-[M]ALLQTYSTU(NOL)+[M]SHTQTYSTU(NOL) > 0
        Local Integer OK : OK=2
        Call OUINON (mess(141,191,1)-mess(205,100,1), OK) From GESECRAN
        If OK=1 mkstat=2 : End : Endif
        Raz [M]WALLQTY(NOL), [M]WALLQTYSTU(NOL)
        Affzo [M]WALLQTY(NOL)
    Endif
    If [M]WIPFLG(NOL) = "" [M]WIPFLG(NOL) = "M" : Endif
    End
    # ------------------------------------ FMI ------------------------
    ########################################
    Subprog AS_FMI(VALEUR)    : # --- Web - Obligatoire - Synchrone
    Variable Integer VALEUR
    Local    Integer NOL :  NOL=nolign-1
    
    # Pas de saisie des ordres de transfert
    GMENLOC(4)=1
    
    # Issue 117004
    # Ctm directe interdit en intersite (intersociete et intrasociete) : Limite produit
    #If [M:SOH1]BETCPY=2 & [M:SOH1]BETFCY=2 GMENLOC(2)=1 Endif : # Bug 56462 : Interdire Ctm directe si inter-site inter-société
    If [M:SOH1]BETFCY=2 GMENLOC(2)=1 Endif : # Bug 56462 : Interdire Ctm directe si inter-site inter-société
    # End issue 117004
    
    # --> Stock        : Non modifiable s'il y a des allocations
    If VALEUR = 1 & [M]STOMGTCOD(NOL) <> 1
    #    If [M]ALLQTY(NOL)<>0 | [M]SHTQTY(NOL)<>0 | [M]ODLQTY(NOL)<>0 | [M]DLVQTY(NOL)<>0 | [M]INVQTY(NOL)<>0
        If [M]TALLQTY(NOL)<>0 | [M]SHTQTY(NOL)<>0 | [M]LPRQTY(NOL)<>0 mkstat = 2 Endif
    Endif
    # GA 12/2010 contremarque de type EO FMI=6
    # --> Contremarque : Non modifiable s'il y a une contremarque # ou des affectations existent (GH bug 85162 11/10/12)
    If (find(VALEUR,2,3,5,6) & [M]FMINUM(NOL) <> "") |
    &  (VALEUR=1 & !find(GREP,"C","D") &
    &   func MTOLINKLIB.LINK_EXISTS([M:SOH4]DSTOFCY(NOL), 2, [M:SOH0]SOHNUM, [M:SOH4]SOPLIN(NOL), [M:SOH4]SOPLIN(NOL), 1))
       mkstat=2
    Endif
    ## Ini SAM 107890/190--X3-4622
    If [M]DLVFLG(NOL)=1
      # Only Normal and PO direct for customer values are allowed
      For I=3 To 6:GMENLOC(I)=1:Next I
    Endif
    ## End SAM 107890/190--X3-4622
    End
    ########################################
    Subprog C_FMI(VALEUR)    : # --- Web - Obligatoire - Synchrone
    Variable Integer VALEUR
    Local    Integer NOL     : NOL= nolign-1
    
    If [F:ITM]ITMREF <> [M:SOH4]ITMREF(NOL)
        Read [F:ITM]ITM0 = [M:SOH4]ITMREF(NOL)
        If fstat  Raz [F:ITM] : Endif
    Endif
    # Pas de contremarque receptionnée si on a pas le module achat
    If VALEUR = 3 & GMODU(6) <> 2
        mkstat=2 : GMESSAGE=mess(157,192,1) : End
    Endif
    # Si article non acheté contremarque impossible
    #If (VALEUR = 2 | VALEUR = 3) & find([F:ITM]CLSTYP, 2,7)
    If (VALEUR = 2 | VALEUR = 3) & [F:ITM]PURFLG<>2
        mkstat=2 : GMESSAGE=mess(50,192,1) : End
    Endif
    # Pas d'ordre de fabrication si on a pas le module production
    If VALEUR = 5 & GMODU(8) <> 2
        mkstat=2 : GMESSAGE=mess(158,192,1) : End
    Endif
    # Si article non fabriqué ordre de fabrication impossible
    If VALEUR = 5 & [M]FMI(NOL)<>VALEUR
        Call CONTMFGITM([M]DSTOFCY(NOL), 1) From MFGLIB
    Endif
    # Aucune Contremarque ou Ordre de fabrication sur une ligne planifiée
    If find(VALEUR, 2,3,5) & [M]DEMSTA(NOL) <> 1
        mkstat=2 : GMESSAGE = mess(156,192,1)
    Endif
    # Si FMI modifié et devient géré en stock : Ctrl article-site
    # Controle existance article-site si modif
    If find(VALEUR, 1,3,5) & VALEUR <> [M:SOH4]FMI(NOL)
        Call CONTITF([M]ITMREF(NOL),[M]DSTOFCY(NOL),[F:ITM]STOMGTCOD) From TRTVENCTL
        If mkstat=2 End Endif
    Endif
    # Bug 55476 : Kit géré en ctm : : Vérif que ts les composants st gérés en ctm
    If VALEUR=2 & [M]LINTYP(NOL)=2
        Local Integer WFMICPE : WFMICPE=2
        Local Integer ORI     : ORI=NOL
        Gosub VERIF_KIT_CTM From TRTVENBOM
        If WFMICPE=1 mkstat=2 : GMESSAGE = mess(338,192,1)-":"-mess(339,192,1) : End Endif
    Endif
    End
    ########################################
    Subprog AM_FMI(VALEUR)
    Variable Integer VALEUR
    Local    Integer NOL :     NOL= nolign-1
    
    # Il y a des nouvelles allocations
    If [M]WALLQTYSTU(NOL)-[M]ALLQTYSTU(NOL)+[M]SHTQTYSTU(NOL) > 0
        Local Integer OK : OK=2
        Call OUINON (mess(141,191,1)-mess(205,100,1), OK) From GESECRAN
        If OK=1 mkstat=2 : End : Endif
    Endif
    If VALEUR = 2
        # Si Contremarque directe : Pas de gestion des stocks
        [M]STOMGTCOD(NOL) = 1
        [M]WIPFLG(NOL) = "A"
        Raz [M]WALLQTY(NOL), WALLQTYSTU(NOL)
        Affzo [M]WALLQTY(NOL)
    Else
        # Sinon Recharger STOMGTCOD
        [M]STOMGTCOD(NOL) = [F:ITM]STOMGTCOD
        If [F:ITM]STOMGTCOD <> 1
            If [F:ITF]ITMREF<>[M]ITMREF(NOL) | [F:ITF]STOFCY<>[M]DSTOFCY(NOL)
                Read [ITF] ITF0=[M]ITMREF(NOL);[M]DSTOFCY(NOL)
                If fstat Raz [F:ITF] : Endif
            Endif
            [M]STOMGTCOD(NOL) = [F:ITF]STOMGTCOD
        Endif
        If [M]WIPFLG(NOL) = "" [M]WIPFLG(NOL) = "M" Endif
    Endif
    # --> Si contremarque : Forcage du type allocation à détaillé
    If !(VALEUR = 1)
        [M]DALLTYP(NOL) = 2
    Else
        [M]DALLTYP(NOL) = [M:SOH2]ALLTYP
    Endif
    
    Affzo [M]DALLTYP(NOL) : # 94719
    
    End
    
    # --------------------------------------------------------------------------------
    #                     Etiquettes
    # --------------------------------------------------------------------------------
    
    # --------------------------------------------------------------------------------
    # Affichage des champs suite à la recherche tarif
    # --------------------------------------------------------------------------------
    $AFF_RECH_TAR
    
    # Issue X3-126595
    Gosub AFF_RECH_TAR From SUBSOH1
    #If dim(GWEBSERV)=1 & GWEBSERV=1 Return Endif
    #
    #Affzo [M:SOH4]GROPRI(NOL)
    #If dim([M:SOH4]DISCRGVAL1(NOL))>0 Affzo [M:SOH4]DISCRGVAL1(NOL) Endif
    #If dim([M:SOH4]DISCRGVAL2(NOL))>0 Affzo [M:SOH4]DISCRGVAL2(NOL) Endif
    #If dim([M:SOH4]DISCRGVAL3(NOL))>0 Affzo [M:SOH4]DISCRGVAL3(NOL) Endif
    #If dim([M:SOH4]DISCRGVAL4(NOL))>0 Affzo [M:SOH4]DISCRGVAL4(NOL) Endif
    #If dim([M:SOH4]DISCRGVAL5(NOL))>0 Affzo [M:SOH4]DISCRGVAL5(NOL) Endif
    #If dim([M:SOH4]DISCRGVAL6(NOL))>0 Affzo [M:SOH4]DISCRGVAL6(NOL) Endif
    #If dim([M:SOH4]DISCRGVAL7(NOL))>0 Affzo [M:SOH4]DISCRGVAL7(NOL) Endif
    #If dim([M:SOH4]DISCRGVAL8(NOL))>0 Affzo [M:SOH4]DISCRGVAL8(NOL) Endif
    #If dim([M:SOH4]DISCRGVAL9(NOL))>0 Affzo [M:SOH4]DISCRGVAL9(NOL) Endif
    #Affzo [M:SOH4]REPCOE(NOL)
    #Affzo [M:SOH4]NETPRI(NOL)
    # End issue X3-126595
    
    Return
    
    # -------------------------------------------------------------------------------------
    # Pour kit/sous-traité, si qté livrable calculée par rapport rupture des composants < qté allouée
    # --> Affichage en vert des champs référence article, qté allouée et qté à allouer
    # -------------------------------------------------------------------------------------
    $COLOR_KIT
    pcolor=GCOUL(0)
    If find([M]LINTYP(nolign-1),2,10) & [M]DLBQTYSTU(nolign-1)<([M]ALLQTYSTU(nolign-1)+[M]SHTQTYSTU(nolign-1))
        pcolor=GCOUL(2)
    Endif
    Return
    
    # --------------------------------------------------------------------- #
    #     ETIQUETTES UTILISEES PAR ACTION SAISTOALL (ALLOCATIONS MANUELLES) #
    #                                                                       #
    #                Appelées depuis TRTSTOALLA                             #
    # --------------------------------------------------------------------- #
    
    #---------------------------------------------------------------------- #
    # Action avant bouton  : Vérifications au préalable                     #
    # Si GNOTALL=1 Pas d'ouverture de la fenêtre allocations manuelles      #
    # Verrou de la commande                                                 #
    #---------------------------------------------------------------------- #
    $AB12_NBLIG
    Local Integer OK, NOL
      NOL=nolign-1
      # -- Commande vérouillée
      Global Integer GLOCKSUP # X3-98359 Locked symbol after manual allocation (LCC-06/08/18)
      Gosub VERROU_SOH From SUBSOHA
    
      ###
      If GERR = 1 Then
        GNOTALL = 1
        Return
      Endif
      If func MANHLDLIB.BLK_ALLOC([M:SOH1]HLDSTA,[M:SOH1]HLDCOD) Then
        # order holds
        GMESSAGE = mess(13,492,1)
        GNOTALL=1
        Return
      Endif
      If [M:SOH1]CDTSTA = 3 Then
        # -- Commande avec Dépassement en-cours
        If !([M:SOH1]BETFCY = 2 & [M:SOH1]BETCPY <> 2) or GCTLBETFCY = 2 Then      # FGR 10/03/2015 : X3SUIVI23273 - Si pas (Intersit & non intersoc) ou si Ctrl intersit encours&prix
          If GCDTUNL = 1 Then
            Call ERREUR(mess(101,197,1)) From GESECRAN
            GNOTALL=1
            Return
          Else
            OK=1
            Call AVERTIR(mess(17,191,1), OK) From GESECRAN
            If OK=1 Then
              GNOTALL=1
              Return
            Endif
          Endif
        Endif
      Elsif [M:SOH1]CDTSTA = 4 Then
        # -- Commande avec Acomptes non versés
        OK=1
        Call AVERTIR(mess(18,191,1), OK) From GESECRAN
        If OK=1 Then
          GNOTALL=1
          Return
        Endif
      Endif
      # -- Ligne de contremarque
      If find([M:SOH4]FMI(NOL),3,5) Then
        If [M:SOH4]FMI(NOL)=3 Then
          GMESSAGE=mess(281,197,1)
          If [M:SOH4]FMINUM(NOL)<>"" Then
            GMESSAGE-=":"-mess(142,191,1)
          Endif
        Endif
        If [M:SOH4]FMI(NOL)=5 Then
          GMESSAGE=mess(280,197,1)
          If [M:SOH4]FMINUM(NOL)<>"" Then
            GMESSAGE-=":"-mess(143,191,1)
          Endif
        Endif
        OK=1
        Call OUINON (GMESSAGE-"\"-mess(205,100,1), OK) From GESECRAN
        Raz GMESSAGE
        If OK=1 Then
          GNOTALL=1
          Return
        Endif
      Endif
      # -- Ligne allouée en Global : On demande si on veut l'allouer en détaillé
      If [M:SOH4]DALLTYP(NOL)=1
        OK=1
        Call OUINON (mess(144,191,1), OK) From GESECRAN
        If OK=1 Then
          GNOTALL=1
          Return
        Endif
      Endif
    Return
    
    #---------------------------------------------------------------------- #
    # Déverrou de la commande                                               #
    #---------------------------------------------------------------------- #
    $BB12_NBLIG
    
    # Si GCONSULT=0, le verrou a été positionné par l'objet SOH : on ne fait rien
    # Si GCONSULT=2, le verrou a été positionné en avant bouton, il faut déverouiller
    
    # X3-98359 Locked symbol after manual allocation (LCC-06/08/18)
    # If GCONSULT=2 Unlock=SYMBOLE2 Endif
    If GLOCKSUP=0 or GCONSULT=2 Unlock=SYMBOLE2 Endif
    Kill GLOCKSUP
    # End X3-98359 Locked symbol after manual allocation (LCC-06/08/18)
    
    Gosub FORCE_RECOVERED_AUPDTICK From SUBSOHA  # FGR 07/07/2015 : X3SUIVI109276
    Return
    
    ######################################################################################
    ## Etiquette ajoutée par le superviseur (écran SOH3) 19/05/2008 15:05:16 (ACA)
    ######################################################################################
    Subprog IB_NBFAC
        If GREP = "C"
            IJ1=-1
            For IJ0 = 0 To dim([M:SFIT]DTA)-1
                If  [M:SFIT]DTA(IJ0)=[M:SOH3]INVDTA(nolign-1) and [M:SFIT]ORI(IJ0)=0
                    IJ1=IJ0
                    Break
                Endif
            Next
            If IJ1=-1 Raz GBOUT3 Endif
        Else
            Raz GBOUT3
        Endif
    End
    
    Subprog B3_NBFAC
        If GREP="C"
            Call DEL_NBTRF_ORI0([M:SOH3]INVDTA(nolign-1), "M", "SOH3") From SUBSFIT
        Endif
    End
    ######################################################################################
    ## Etiquette ajoutée par le superviseur (écran SOH3) 03/12/2008 15:42:36 (ACA)
    ######################################################################################
    Subprog APRES_NBFAC
        # ACA - Pour mise à jour du Format le cas échéant
        Affzo [M:SOH3]INVDTAAMT(nolign-1)
    End
    ######################################################################################
    # pour la navigation vers le plan d'affectation
    $MEM_VCR
    
    # Issue X3-126595
    Gosub MEM_VCR From SUBSOH1
    #If find(GREP,"C","D")
    #    If dim(GVCR)=1 : # If dim(GVCR) : # GH 24/10/12 bug 85427
    #        Raz GVCR, GLIN, GSEQ
    #    Endif
    #    Return
    #Endif
    #If dim(GVCR) < 0
    #    Global Char    GVCR
    #    Global Integer GLIN
    #    Global Integer GSEQ
    #Endif
    #
    #GVCR = [M:SOH0]SOHNUM
    #GLIN = [M:SOH4]SOPLIN(nolign-1)
    #GSEQ = [M:SOH4]SOPLIN(nolign-1)
    # End issue X3-126595
    
    Return
    
    
    ######################################################################################
    
    ######################################################################################
    ## Etiquette ajoutée par le superviseur (écran SOH2) 29/12/2010 14:43:56 (CPO)
    ######################################################################################
    #CPO 70249 - Modification du mode de livraison
    Subprog AM_MDL(VALEUR)
    Variable Char    VALEUR()
    
    If VALEUR=""
      # -- plus de mode de livraison => Raz de EECLOC, EECTRN ?
    Else
      If !clalev([F:TMD]) : Local File TABMODELIV [TMD] : Endif :# Modes de livraison
      # -- le mode de livraison a changé =>
      # -- MAJ de EECICT, EECLOC, ICTCTY depuis le paramétrage des modes de livraisons
      If [F:TMD]MDL<>VALEUR
        Read [F:TMD]TMD0=VALEUR
        If fstat : Raz [F:TMD] : Endif
      Endif
      If dim([M:SOH0]EECICT)>0 : [M:SOH0]EECICT = [F:TMD]EECICT : Endif
      If dim([M:SOH2]EECICT)>0 : [M:SOH2]EECICT = [F:TMD]EECICT : Affzo [M:SOH2]EECICT : Endif :#-- CPO 65018
      If dim([M:SOH0]EECLOC)>0
        [M:SOH0]EECLOC = [F:TMD]EECLOC
      Endif
      #Raz [M:SOH0]ICTCTY :# Raz de la ville     ?
      #Raz [M:SOH2]BPTNUM :# Raz du transporteur ?
    Endif
    
    End
    ######################################################################################
    Subprog AM_EECICT(VALEUR)
    Variable Char    VALEUR()
    #-- CPO 65018
    [M:SOH0]EECICT = VALEUR
    
    End
    
    Subprog AM_ICTCTY(VALEUR)
    Variable Char    VALEUR()
    #-- CPO 65018
    [M:SOH0]ICTCTY = VALEUR
    
    End
    ######################################################################################
    Subprog IB_BPCORD
    End
    
    ######################################################################################
    Subprog IB_ORDINVATI
    Call IB_LTAINVATI(2) From TRTTAXUSA     # Display SST button or not
    End
    
    ######################################################################################
    Subprog AS_SFISSTCOD(VALEUR)
    Variable Char    VALEUR()
    #101380 - Do not alow updating of SST code for certain cases.
    #See SUBSFIT for setting of override flag.
    If [M:SOH3]SFISSTOVRFLG(nolign-1)=1 : mkstat=2 : Endif
    End
    
    ######################################################################################
    ## Etiquette ajoutée par le superviseur (écran SOH1) 06/03/2015 10:04:39 (FGR)
    ######################################################################################
    Subprog CL_HLDBTN(VALEUR)
    Variable Char    VALEUR()
    
      # FGR 06/03/2015 : X3SUIVI106789 : Pour forcer la relecture après l'exécution du Click
      mkstat = GSTALIT
    End
    
    ######################################################################################
    ## Etiquette ajoutée par le superviseur (écran SOH1) 06/03/2015 10:26:52 (FGR)
    ######################################################################################
    Subprog CL_CDTBTN(VALEUR)
    Variable Char    VALEUR()
    
      # FGR 06/03/2015 : X3SUIVI106789 : Pour forcer la relecture après l'exécution du Click
      mkstat = GSTALIT
    End
    
    ######################################################################################
    Subprog AS_ECCVALMAJ(VALEUR)
    Variable Char    VALEUR()
    
      # FGR 01/04/2015 : X3SUIVI105605
      Gosub ECCVALMAJMIN_ENABLE
    End
    
    ######################################################################################
    Subprog AS_ECCVALMIN(VALEUR)
    Variable Char    VALEUR()
    
      # FGR 01/04/2015 : X3SUIVI105605
      Gosub ECCVALMAJMIN_ENABLE
    End
    
    # 105605 : CCM - Revision index (LD:18/06/15)
    ######################################################################################
    Subprog AM_ECCVALMIN(VALEUR)
    Variable Char    VALEUR()
    
    Local Integer NOL : NOL=nolign-1
    Gosub ECCVALMAJMIN_CTM
    If mkstat=2 End Endif
    
    If [M]WIPFLG(NOL) = "" [M]WIPFLG(NOL) = "M" : Endif : # Issue 114112
    
    End
    # 105605 : CCM - Revision index (LD:18/06/15)
    
    ######################################################################################
    Subprog C_ECCVALMAJ(VALEUR)
    Variable Char    VALEUR()
    
    Local Integer LRET
    Local Integer NOL
    Local Integer IOK
    
      # FGR 10/04/2015 : X3SUIVI105605
      NOL = nolign-1
      Call CTLECCVAL(VALEUR, [M:SOH4]DSTOFCY(NOL), [M:SOH4]ITMREF(NOL), 4, "", [M:SOH4]DSHIDAT(NOL), LRET) From STKSOR
      If LRET > 1 Then
        mkstat = 2
        End
      Elsif LRET = 1 Then
        IOK = [V]CST_AYES
        Call AVERTIR (GMESSAGE, IOK) From GESECRAN
        Raz GMESSAGE
        If IOK = 1 Then
          mkstat = 2
          End
        Endif
      Endif
    End
    
    ######################################################################################
    Subprog AM_ECCVALMAJ(VALEUR)
    Variable Char    VALEUR()
    
    Local Char WECCVALMAJ(GLONECS)
    Local Char WECCVALMIN(GLONICVVAL)
    Local Char PITM(GLONITM)
    
    # 105605 : CCM - Revision index (LD:18/06/15)
    Local Integer NOL : NOL=nolign-1
    Gosub ECCVALMAJMIN_CTM
    If mkstat=2 End Endif
    # 105605 : CCM - Revision index (LD:18/06/15)
    If [M]WIPFLG(NOL) = "" [M]WIPFLG(NOL) = "M" : Endif : # Issue 114112
    
      # FGR 10/04/2015 : X3SUIVI105605
      Raz PITM
      # si version majeure trouvée et si article gere la version mineure : recherche derniere version mineure
      If [F:ITM]ITMREF <> [M:SOH4]ITMREF(nolign-1) Then
        Read [ITM]ITM0=[M:SOH4]ITMREF(nolign-1)
      Endif
      If VALEUR  <> "" and [F:ITM]ECCSTO = 3 Then
        WECCVALMAJ = VALEUR
        PITM = [F:ITM]ITMREF
        Gosub READECCMIN From STKACT
        [M:SOH4]ECCVALMIN(nolign-1) = WECCVALMIN
        Affzo [M:SOH4]ECCVALMIN(nolign-1)
      Elsif VALEUR = "" and [M:SOH4]ECCVALMIN(nolign-1) <> "" Then
        Raz [M:SOH4]ECCVALMIN(nolign-1)
        Affzo [M:SOH4]ECCVALMIN(nolign-1)
      Endif
    End
    
    ######################################################################################
    $ECCVALMAJMIN_ENABLE
    
    # Issue X3-126595
    Gosub ECCVALMAJMIN_ENABLE From SUBSOH1
    #  # FGR 01/04/2015 : X3SUIVI105605
    #  If [M:SOH4]TALLQTYSTU(nolign-1) > 0 Then
    #    mkstat = 2
    #  Endif
    #  If find([M:SOH4]LINTYP(nolign-1),3,4,5,11,12,13) Then
    #    mkstat = 2
    #  Endif
    # End issue X3-126595
    
    Return
    
    # 105605 : CCM - Revision index (LD:18/06/15)
    # -------------------------------------------------- #
    #   Contrôle lié à la contremarque :                 #
    # -------------------------------------------------- #
    $ECCVALMAJMIN_CTM
    
    # Issue X3-126595
    Gosub ECCVALMAJMIN_CTM From SUBSOH1
    #Local Integer WOK : WOK=2
    #
    #If [M:SOH4]FMINUM(NOL) = "" Return Endif
    #
    #If [M:SOH4]FMI(NOL)=2
    #    # Cette ligne a fait l'objet d'une contremarque directe
    #    GMESSAGE = mess(270,191,1) : mkstat = 2
    #Elsif [M:SOH4]FMI(NOL)=3
    #    # Cette ligne a fait l'objet d'une contremarque réceptionnée
    #    GMESSAGE = mess(271,191,1)
    #    If GMODU(6)=2
    #       Local File PORDER [POH]
    #       Read [POH]POH0=[M:SOH4]FMINUM(NOL)
    #       If fstat Raz [F:POH] Endif
    #       # La commande d'achat est imprimée
    #       If [F:POH]PRNFLG=2 GMESSAGE= GMESSAGE+"."-mess(272,191,1) Endif
    #    Endif
    #    Call AVERTIR(GMESSAGE,WOK) From GESECRAN
    #    Raz GMESSAGE
    #    If WOK=1 mkstat=2 Endif
    #Elsif [M:SOH4]FMI(NOL)=5
    #    # Cette ligne a fait l'objet d'une ordre de fabrication
    #    GMESSAGE = mess(269,191,1) : mkstat = 2
    #Endif
    # End issue X3-126595
    
    Return
    # 105605 : CCM - Revision index (LD:18/06/15)
    
    ######################################################################################
    Subprog C_DSTOFCY(VALEUR)
    Variable Char    VALEUR()
    
    Local Integer LRET
    Local Integer NOL
    
      # FGR 10/04/2015 : X3SUIVI105605
      If dim([M:SOH4]ECCVALMAJ) >= 0 Then
        NOL = nolign-1
        Call CTLECCVAL([M:SOH4]ECCVALMAJ(NOL), VALEUR, [M:SOH4]ITMREF(NOL), 4, "", [M:SOH4]DSHIDAT(NOL), LRET) From STKSOR
        If LRET > 1 Then
          mkstat = 2
        Endif
      Endif
    End
    ######################################################################################
    
    # 106776- EDI fields
    ######################################################################################
    Subprog D_DEMDLVHOU(VALEUR)
    Variable Char    VALEUR()
      Gosub CTL_D_DEMDLVHOU From TRTFLDEDI
    End
    
    Subprog AM_DEMDLVHOU(VALEUR)
    Variable Char    VALEUR()
    # X3-187783_Update_of_Sales_order_with_no_expected_delivery_time (JUCON 2020-03-19)
    #  Gosub CTL_DEMDLVHOU
      If VALEUR<>"0000":  Gosub CTL_DEMDLVHOU From TRTFLDEDI: Endif
    End
    
    Subprog C_MAXDLVDAT(VALEUR)
    Variable Date    VALEUR
      Gosub CTL_MAXDLVDAT From TRTFLDEDI
    End
    Subprog C_MAXDLVHOU(VALEUR)
    Variable Char    VALEUR()
      Gosub CTL_MAXDLVHOU From TRTFLDEDI
    End
    
    Subprog C_USELIMDAT(VALEUR)
    Variable Date    VALEUR
      Gosub CTL_USELIMDAT From TRTFLDEDI
    End
    # 106776- EDI fields
    ######################################################################################
    
    Subprog AS_DDEMDLVDAT(VALEUR)
    Variable Date    VALEUR
    ## 107890: Scheduled invoices: (LC:15/11/16)
    If [M:SOH4]DLVFLG(nolign-1)<>2 & [M:SOH0]SOHCAT=1
       mkstat=2
       End
    Endif
    End
    
    ######################################################################################
    ## Section automatically added (screen SOH4) 12/23/2016 13:08:21 (JUCON)
    ######################################################################################
    Subprog AM_VACITM2(VALEUR)
    Variable Char    VALEUR()
    # Ini SAM 85188 Taxes avec formule sur lignes document JUCON 23/12/2016
    # --> Calcul des montants de base calcul de taxe
    Local    Decimal WUNTCLCAMT1, WUNTCLCAMT2 : Raz WUNTCLCAMT1, WUNTCLCAMT2
    Local Integer NOL: NOL=nolign-1
    If [M]QTY(NOL) <> 0
        WUNTCLCAMT1=[M]CLCAMT1(NOL)/[M]QTY(NOL) : WUNTCLCAMT2=[M]CLCAMT2(NOL)/[M]QTY(NOL)
    Endif
    Call ALICLCAMT([M:SOH4]ITMREF(NOL),[M]QTY(NOL), NOL, "SOH4", [M:SOH4]CLCAMT1(NOL), [M:SOH4]CLCAMT2(NOL)) From TRTX3
    # End SAM 85188 Taxes avec formule sur lignes document JUCON 23/12/2016
    Gosub UPD_PREP_MESS From SUBSOHA1 # X3-246884 By SDEM
    End
    
    Subprog AM_VACITM3(VALEUR)
    Variable Char    VALEUR()
    # Ini SAM 85188 Taxes avec formule sur lignes document JUCON 23/12/2016
    # --> Calcul des montants de base calcul de taxe
    Local    Decimal WUNTCLCAMT1, WUNTCLCAMT2 : Raz WUNTCLCAMT1, WUNTCLCAMT2
    Local Integer NOL: NOL=nolign-1
    If [M]QTY(NOL) <> 0
        WUNTCLCAMT1=[M]CLCAMT1(NOL)/[M]QTY(NOL) : WUNTCLCAMT2=[M]CLCAMT2(NOL)/[M]QTY(NOL)
    Endif
    Call ALICLCAMT([M:SOH4]ITMREF(NOL), [M]QTY(NOL), NOL, "SOH4", [M:SOH4]CLCAMT1(NOL), [M:SOH4]CLCAMT2(NOL)) From TRTX3
    # End SAM 85188 Taxes avec formule sur lignes document JUCON 23/12/2016
    Gosub UPD_PREP_MESS From SUBSOHA1 # X3-246884 By SDEM
    End
    
    
    ######################################################################################
    
    ######################################################################################
    ## Etiquette ajoutée par le superviseur (écran SOH4) 12/01/2017 09:36:01 (LD)
    ######################################################################################
    Subprog IB_PCK
    End
    
    ######################################################################################
    #issue X3-132902 by VAVIL
    Subprog AS_ITMDES(VALEUR)
    Variable Char    VALEUR()
    If func PORLEGLIB.PORLEG([M:SOH0]SALFCY, "")=1
      mkstat = 2
    Endif
    End
    #end issue X3-132902
    ######################################################################################
    
    # Issue X3-110981/189977 - 2020-06-10 by MUARN : strict control of PJT
    Subprog C_PJT(VALEUR)
    Variable Char    VALEUR()
    #!!!!!!!!
    # BE CARFUL
    # same process in INIITMORI from TRTVENBOM
    
    # the check of strit control of PJT must be done here in C_PJT and not in AM_PJT
    # to check before the question data type to modify the line
    # so if no modification no control
    If VALEUR=[M:SOH1]PJT : End : Endif
    
    If [M:SOH4]NBLIG = 0 : End : Endif
    
    If !func ASYRFNC.ACTIV("PJM") : End : Endif
    
    Local Integer IRET
    
    Local Integer WRET : Raz WRET
    Local Char WOLDPJT(GLONPJT) : WOLDPJT=[M:SOH1]PJT
    Local Char WNEWPJT(GLONPJT) : WNEWPJT=VALEUR
    
    Local Char WNEWPROJECT(GLONPIM)
    Local Char WNEWBUDGET(GLONPBU)
    Local Char WNEWTASK(GLONTAC)
    IRET = func PIMPL_CSTD_PROGS.PJM_KEY_SPLIT(GACTX, WNEWPJT, WNEWPROJECT, WNEWBUDGET, WNEWTASK)
    
    Local Char WOLDPROJECT(GLONPIM)
    Local Char WOLDBUDGET(GLONPBU)
    Local Char WOLDTASK(GLONTAC)
    IRET = func PIMPL_CSTD_PROGS.PJM_KEY_SPLIT(GACTX, WOLDPJT, WOLDPROJECT, WOLDBUDGET, WOLDTASK)
    # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan - 2020-07-16 by LD
    #If WOLDPROJECT=WNEWPROJECT : End :  Endif
    # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan - 2020-07-16 by LD
    
    Gosub C_PJT_PJTMST_CTRL From LIBSAL_INVCND_SOH
    # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan - 2020-07-16 by LD
    If GERR=1 mkstat=2 : Raz GERR Endif
    #If GERR = 1
    #  Local Integer WOK
    #  If GPJTSNGDOC = G_NON Then
    #    WOK=2
    #    Call AVERTIR (GMESSAGE, WOK) From GESECRAN
    #  Else
    #    WOK=1
    #    Call ERREUR(GMESSAGE) From GESECRAN
    #  Endif
    #  Raz GERR, GMESSAGE
    #  If WOK = 1
    #    mkstat=2
    #  Endif
    #Endif
    # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan - 2020-07-16 by LD
    
    End
    
    
    
    #############################################################################################
    #                                                                                           #
    # SUBSOH1 : TRAITEMENTS STANDARDS UTILISES DANS LES COMMANDES DE VENTE                      #
    #                                                                                           #
    #############################################################################################
    #############################################################################################
    #                                                                                           #
    # Etiquettes appelées par TRTSTOALLA                                                        #
    #                                                                                           #
    #  $CHARGE_STOALL : Chargement des paramètres dans masque STOALL                            #
    #  $AVANT_STOALL  : Contrôle avant enregistrement                                           #
    #  $APRES_STOALL  : Mise à jour complémentaires après enregistrement                        #
    #############################################################################################
    #                                                                                                       #
    # Etiquettes/sous-pro appelées par SUBSOH                                                               #
    #                                                                                                       #
    #  $TRT_CTM         : Traitement d'un article géré en contremarque                                      #
    #  $VERIF_CPSALLQTY : Si composé nomenclature : msg avert. si pour un composant Qté cdée < Total alloué #
    #  $INIT_WALLQTYSTU : Traitement d'un article géré en contremarque                                      #
    #  $INIT_DAT        : Initialisation des dates entête commande : date expédition et date de livraison demandée #
    #
    #  $P1_NBLIG
    #  $P2_NBLIG
    #  B4_NBLIG
    #  $ECCVALMAJMIN_ENABLE                                                                     # Issue X3-126595
    #  $ECCVALMAJMIN_CTM                                                                        # Issue X3-126595
    #  $MEM_VCR                                                                                 # Issue X3-126595
    #  $AFF_RECH_TAR                                                                            # Issue X3-126595
    #  $CTL_PJT_COMPATIBILITY                                                                   # 139565 : Milestone billing / X3-185425 - 2020-03-19 by LD
    #########################################################################################################
    # Issue X3-126595 - 20190213 by LD : Error in prices for the options in a kit when the sales order is created via a webservice
    
    #---------------------------------------------------------------------- #
    # Chargement des paramètres dans masque STOALL                          #
    # Cette étiquette est appelée depuis CHARGE_PARAM From TRTSTOALLA       #
    #---------------------------------------------------------------------- #
    $CHARGE_STOALL
    
    # Chargement du masque [M:ALL]
    Local Decimal WTOT, WTOTSTU
    #Local Char    LWRH(GLONWRH)
    #Local Integer LEXC
    
    Raz [M:ALL]
    [M:ALL]VCRTYP=2
    [M:ALL]VCRNUM=[M:SOH0]SOHNUM
    [M:ALL]VCRLIN=[M:SOH4]SOPLIN (LNOL)
    [M:ALL]VCRSEQ=[M:SOH4]SOPLIN (LNOL)
    [M:ALL]PCU=[M:SOH4]SAU (LNOL)
    [M:ALL]STU=[M:SOH4]STU (LNOL)
    [M:ALL]PCUSTUCOE=[M:SOH4]SAUSTUCOE (LNOL)
    [M:ALL]BPCORD=[M:SOH0]BPCORD
    [M:ALL]BPAADD=[M:SOH4]DBPAADD(LNOL)
    # Quantité besoin en allocation = commandé - déjà préparé/livré/facturé
    # Recalcul du déjà préparé/livré/facturé
    WTOTLIV=[M:SOH4]TALLQTYSTU(LNOL) - [M:SOH4]ALLQTYSTU(LNOL)
    [M:ALL]RETQTY = [M:SOH4]QTYSTU(LNOL) - WTOTLIV
    If [M:ALL]RETQTY < 0 [M:ALL]RETQTY = 0 Endif
    [M:ALL]OLDALLQTY = [M:SOH4]ALLQTYSTU(LNOL)
    [M:ALL]SHTQTY = [M:SOH4]SHTQTYSTU(LNOL)
    # Alimentation de la qté à allouer
    [M:ALL]QTYTOALL  = [M:SOH4]WALLQTYSTU(LNOL)
    # Alimentation de la qté déjà allouée en global
    Raz [M:ALL]GLOALLQTY : If [M:SOH4]DALLTYP(LNOL)=1 [M:ALL]GLOALLQTY=[M:SOH4]ALLQTYSTU(LNOL) Endif
    
    [M:ALL]ALLTYP = [M:SOH4]DALLTYP(LNOL)
    # 88827 : La date besoin doit tjs être alimentée avec la date d'expédition pour respecter l'ordre chronologique des ddes d'allocation
    #[M:ALL]RETDAT = max(date$, [M:SOH4]DSHIDAT(LNOL))
    [M:ALL]RETDAT = [M:SOH4]DSHIDAT(LNOL)
    # 88827
    [M:ALL]DLVDAT = max(date$, [M:SOH4]EXTDLVDAT(LNOL))
    [M:ALL]PECINTLOC = 2
    [M:ALL]PECPLFLOC = 2    : # Prise en cpte empl quai : Oui
    [M:ALL]XLOT   = [M:SOH4]LOT(LNOL)
    [M:ALL]XLOC   = [M:SOH4]LOC(LNOL)
    [M:ALL]XSTA   = [M:SOH4]STA(LNOL)
    # FGR 04/05/2015 : X3SUIVI105605 (début)
    If dim([M:SOH4]ECCVALMAJ) >= 0 Then
      [M:ALL]WECCVALMAJ = [M:SOH4]ECCVALMAJ(LNOL)
    Endif
    # FGR 04/05/2015 : X3SUIVI105605 (fin)
    GTYPLIG=0
    If find([M:SOH4]LINTYP(LNOL),3,4,5,11,12,13)  GTYPLIG=1 Endif
    If find([M:SOH4]FMI(LNOL), 3,5)               GTYPLIG=2 Endif
    
    If find([M:SOH4]LINTYP(LNOL),3,4,5,11,12,13)  Diszo [M:ALL]QTYTOALL Endif
    
    # Récupération du paramêtre stock : Génération de ruptures
    Local Char     WPARAM(10)
    Call PARAML([M:SOH4]DSTOFCY(LNOL),"GENSHT",WPARAM) From ADOVAL      # FGR 28/07/2015 : X3SUIVI108078 : Plus Call PARAM (performances)
    GGENSHT=val(WPARAM)
    # Commande de prêt
    If [M:SOH0]SOHCAT=2
       GPRET = 1
    Else
       GPRET = 0
    Endif
    
    Return
    
    #---------------------------------------------------------------------- #
    # Contrôle avant enregistrement                                         #
    # Si contrôle non OK, mettre OK=0 pour ne pas enregister                #
    # Cette étiquette est appelée depuis AVANT_ENR From TRTSTOALLA          #
    #---------------------------------------------------------------------- #
    $AVANT_STOALL
    
    # Quantité totale <> quantité à allouer
    If [M:ALL]PECQTY < [M:ALL]QTYTOALL
        OK = 2
    #   Livraison ligne/cde complète : On doit tout allouer
        If find([M:SOH2]DME,2,3)
            Call OUINON(mess(107,191,1),OK) From GESECRAN
        Endif
        If OK <> 2 FOK=0 : Return : Endif
    Endif
    
    Return
    
    #---------------------------------------------------------------------- #
    # Mise à jour complémentaires après enregistrement                      #
    # Si problème mettre GOK=0 pour annuler l'enregistrement                #
    # Cette étiquette est appelée depuis APRES_ENR From TRTSTOALLA          #
    #---------------------------------------------------------------------- #
    $APRES_STOALL
    Local Integer NL, WRET
    Local Decimal WALLSTU
    Local Char    WTRTLIG(1)
    
    #[M:ALL]ALLTYP=2
    
    If WCSOQTY<>0
        Local Char WVCRRER
        WVCRRER = format$("K:"+num$(GLONBPC)+"X", [M:ALL]BPCORD)+format$("K:"+num$(GLONBPD)+"X", [M:ALL]BPAADD)
        WVCRRER = vireblc(WVCRRER, 1)
        # Si consommation des réservations clients : Maj de l'encours correspondant
        Call MAJORDBPC(1,WVCRRER,[M:SOH4]ITMREF(LNOL),[M:SOH4]DSTOFCY(LNOL),WCSOQTY,WRET) From TRTVENALL
        If WRET <> 0 GOK=0 : Return Endif
    Endif
    #   Mise à jour commande
    Call MAJALLORD([M:ALL]VCRNUM, [M:ALL]VCRLIN, [M:ALL]VCRSEQ, [M:ALL]ALLTYP, 1, WALLQTY, WSHTQTY, WRET) From TRTVENALL
    If WRET <> 0 : GOK = 0 : Return : Endif
    #   Si Composé de kit, il faut allouer les composants
    WALLSTU=WALLQTY+WSHTQTY
    WALLSTU=WALLSTU-([M:SOH4]ALLQTYSTU(LNOL)+[M:SOH4]SHTQTYSTU(LNOL))
    Raz WTRTLIG
    If find([M:SOH4]LINTYP(LNOL),2,10) & WALLSTU <> 0
        If WALLSTU < 0
    # ----- C'est une diminution/annulation de l'allocation
            WTRTLIG = "D"
            WALLSTU = abs(WALLSTU)
        Elsif WALLSTU > 0
    # ----- C'est une augmentation de l'allocation
            If [M:SOH4]ALLQTYSTU(LNOL) = 0 & [M:SOH4]SHTQTYSTU(LNOL) = 0
                 WTRTLIG = "C"
            Else
                 WTRTLIG = "M"
            Endif
            WALLSTU=WALLQTY+WSHTQTY
        Endif
        Call GENALLKIT ([M:ALL]VCRNUM, [M:ALL]VCRLIN, [M:ALL]VCRSEQ, WTRTLIG, GRERBPC, 2, 0, 1, 0, WALLSTU,
    &                   WRET) From TRTVENALL
        If WRET <> 0 GOK=0 : Return : Endif
    Endif
    #    Réaffichage du masque [M:SOH4]
    If [F:SOH]SOHNUM <> [M:SOH0]SOHNUM
        Read [SOH]SOH0=[M:SOH0]SOHNUM
        If fstat : Return : Endif
    Endif
    [M:SOH1]ALLSTA = [F:SOH]ALLSTA
    
    If [F:SOQ]SOHNUM<>[M:SOH0]SOHNUM | [F:SOQ]SOPLIN<>[M:SOH4]SOPLIN(LNOL) | [F:SOQ]SOQSEQ<>[M:SOH4]SOPLIN(LNOL)
        Read [SOQ]SOQ0=[M:SOH0]SOHNUM;[M:SOH4]SOPLIN(LNOL);[M:SOH4]SOPLIN(LNOL)
        If fstat : Return : Endif
    Endif
    [M:SOH4]ALLQTY(LNOL)    = [F:SOQ]ALLQTY
    [M:SOH4]ALLQTYSTU(LNOL) = [F:SOQ]ALLQTYSTU
    [M:SOH4]SHTQTY(LNOL)    = [F:SOQ]SHTQTY
    [M:SOH4]SHTQTYSTU(LNOL) = [F:SOQ]SHTQTYSTU
    [M:SOH4]DALLTYP(LNOL)   = [F:SOQ]ALLTYP
    
    [M:SOH4]TALLQTYSTU(LNOL) = sum([F:SOQ]ALLQTYSTU,[F:SOQ]ODLQTYSTU,[F:SOQ]OPRQTYSTU,[F:SOQ]PREQTYSTU)
    [M:SOH4]TALLQTY(LNOL)    = sum([F:SOQ]ALLQTY,[F:SOQ]ODLQTY,[F:SOQ]OPRQTY,[F:SOQ]PREQTY)
    If [M:SOH0]SOHCAT = 3
        [M:SOH4]TALLQTYSTU(LNOL) += [F:SOQ]INVQTYSTU
        [M:SOH4]TALLQTY(LNOL)    += [F:SOQ]INVQTY
    Else
        [M:SOH4]TALLQTYSTU(LNOL) += [F:SOQ]DLVQTYSTU
        [M:SOH4]TALLQTY(LNOL)    += [F:SOQ]DLVQTY
    Endif
    # --- Qté à allouer = Qté déjà allouée
    [M:SOH4]WALLQTY(LNOL)   = [F:SOQ]ALLQTY + [F:SOQ]SHTQTY
    [M:SOH4]WALLQTYSTU(LNOL)= [F:SOQ]ALLQTYSTU + [F:SOQ]SHTQTYSTU
    [M:SOH4]YALLQTY(LNOL)   = [M:SOH4]ALLQTY(LNOL)
    [M:SOH4]YSHTQTY(LNOL)   = [M:SOH4]SHTQTY(LNOL)
    
    Raz [M:SOH4]DLBQTYSTU (LNOL)
    # Si kit/sous-traité, sauvegarde de l'indice du kit et de la qté cdée pour calcul qté livrable
    If find([M:SOH4]LINTYP(LNOL),2,10)
        Local Decimal WKIT_QTYSTU  : Raz WKIT_QTYSTU
        If [M:SOH4]ALLQTYSTU(LNOL)<>0
            WKIT_QTYSTU=[M:SOH4]QTYSTU(LNOL)
            [M:SOH4]DLBQTYSTU(LNOL)=[M:SOH4]ALLQTYSTU(LNOL)
        Endif
    Endif
    
    Affzo [M:SOH1]ALLSTA
    If find([M:SOH4]LINTYP(LNOL),2,10) & WTRTLIG<>""
    #   composé kit ou sous-traité : il faut réafficher tous les composants
        NL=LNOL+1
        While find([M:SOH4]LINTYP(NL),3,4,5,11,12,13) & NL < [M:SOH4]NBLIG
            Read [SOQ]SOQ0=[M:SOH0]SOHNUM;[M:SOH4]SOPLIN(NL);[M:SOH4]SOPLIN(NL)
            If fstat : Break : Endif
            [M:SOH4]ALLQTY(NL)    = [F:SOQ]ALLQTY
            [M:SOH4]ALLQTYSTU(NL) = [F:SOQ]ALLQTYSTU
            [M:SOH4]SHTQTY(NL)    = [F:SOQ]SHTQTY
            [M:SOH4]SHTQTYSTU(NL) = [F:SOQ]SHTQTYSTU
            [M:SOH4]DALLTYP(NL)   = [F:SOQ]ALLTYP
            [M:SOH4]TALLQTYSTU(NL)= sum([F:SOQ]ALLQTYSTU,[F:SOQ]ODLQTYSTU,[F:SOQ]OPRQTYSTU,[F:SOQ]PREQTYSTU)
            [M:SOH4]TALLQTY(NL)   = sum([F:SOQ]ALLQTY,[F:SOQ]ODLQTY,[F:SOQ]OPRQTY,[F:SOQ]PREQTY)
            If [M:SOH0]SOHCAT = 3
                [M:SOH4]TALLQTYSTU(NL) += [F:SOQ]INVQTYSTU
                [M:SOH4]TALLQTY(NL)    += [F:SOQ]INVQTY
            Else
                [M:SOH4]TALLQTYSTU(NL) += [F:SOQ]DLVQTYSTU
                [M:SOH4]TALLQTY(NL)    += [F:SOQ]DLVQTY
            Endif
            # --- Qté à allouer = Qté déjà allouée
            [M:SOH4]WALLQTY(NL)        = [F:SOQ]ALLQTY + [F:SOQ]SHTQTY
            [M:SOH4]WALLQTYSTU(NL)     = [F:SOQ]ALLQTYSTU + [F:SOQ]SHTQTYSTU
            [M:SOH4]YALLQTY(NL)   = [M:SOH4]ALLQTY(NL)
            [M:SOH4]YSHTQTY(NL)   = [M:SOH4]SHTQTY(NL)
    
            # Si composant de kit en rupture, calcul de la qté livrable pour le kit
            # --- Qté livrable = Qté allouée du kit - Qté Rupture ramenée au niveau kit
            If dim(WKIT_QTYSTU)>0 & WKIT_QTYSTU<>0 & [M:SOH4]SHTQTYSTU(NL)>0
                Local Decimal WRAPPORT : WRAPPORT=WKIT_QTYSTU / [M:SOH4]QTYSTU(NL)
                Local Decimal WDLBQTYSTU : WDLBQTYSTU=[M:SOH4]WALLQTYSTU(LNOL)-arr([M:SOH4]SHTQTYSTU(NL)*WRAPPORT,0.000001)
                If WDLBQTYSTU<[M:SOH4]DLBQTYSTU(LNOL) [M:SOH4]DLBQTYSTU(LNOL)=WDLBQTYSTU Endif
            Endif
    
            Affzo [M:SOH4]ALLQTY(NL), SHTQTY(NL), WALLQTY(NL)
            NL+=1
        Wend
    Endif
    Affzo [M:SOH4]ITMREF(LNOL), ALLQTY(LNOL), SHTQTY(LNOL), WALLQTY(LNOL), DALLTYP(LNOL)
    
    # Si kit/sous-traité, affichage de la qté livrable
    If !find([M:SOH4]LINTYP(LNOL),2,10) Return Endif
    GERR=4: GMESSAGE="                                  "
    If [M:SOH4]DLBQTYSTU(LNOL)<[M:SOH4]WALLQTYSTU(LNOL)
        Local Decimal WDLBQTY
        If [M:SOH4]SAUSTUCOE(LNOL)<>1
            WDLBQTY=[M:SOH4]DLBQTYSTU(LNOL)*(1/[M:SOH4]SAUSTUCOE(LNOL))
        Else
            WDLBQTY=[M:SOH4]DLBQTYSTU(LNOL)
        Endif
        Call QTEARR(WDLBQTY, [M:SOH4]SAU(LNOL)) From TRTDIV
        GMESSAGE=(mess(610,197,1)-num$(WDLBQTY)-[M:SOH4]SAU(LNOL))
    Endif
    
    Return
    # -------------------------------------------- #
    # Traitement d'un article géré en contremarque #
    # -------------------------------------------- #
    $TRT_CTM
    
    If [F:ITS]CTMQTY > 0
        If GMODIF = 2 & [M]FMI(NOL)=3 & [M]LINTYP(NOL)<>2 : # Bug 55476
            # Création d'une ligne
            If [M:SOH4]SAU(NOL) <> [F:ITM]SAU
                 Call SCAL_QUV(VALEUR, [M:SOH4]ITMREF(NOL),[M]BPCORD,[M:SOH4]SAU(NOL),[F:ITM]SAU, QTY_UV, GBIDD1) From TRTVENQTE
            Else
                 QTY_UV = VALEUR
            Endif
            # -->  On regarde si ctm directe
            If QTY_UV >= [F:ITS]CTMQTY
                [M]FMI(NOL) = 2
                [M]STOMGTCOD(NOL) = 1
            Endif
        Elsif GMODIF = 0 & find([M]FMI(NOL), 2,3) & [M]FMINUM(NOL)=""
            # Modification d'une ligne
            If [M:SOH4]SAU(NOL) <> [F:ITM]SAU
                 Call SCAL_QUV([M]QTY(NOL), [M:SOH4]ITMREF(NOL),[M]BPCORD,[M:SOH4]SAU(NOL),[F:ITM]SAU, QTY_UV,  GBIDD1) From TRTVENQTE
                 Call SCAL_QUV(VALEUR,      [M:SOH4]ITMREF(NOL),[M]BPCORD,[M:SOH4]SAU(NOL),[F:ITM]SAU, QTY_UV1, GBIDD1) From TRTVENQTE
            Else
                 QTY_UV  = [M]QTY(NOL)
                 QTY_UV1 = VALEUR
            Endif
            # Si FMI était en concordance avec la qté cdée et la qté cdée a été modifiée : Faut-il réajuster FMI ?
            Local Integer WOK : WOK=1
            If    (QTY_UV< [F:ITS]CTMQTY & [M]FMI(NOL)=3 & QTY_UV1>=[F:ITS]CTMQTY)
               # Ligne gérée en contremarque réceptionnée. Voulez-vous la gérer en contremarque directe ?
               WOK=2 : Call OUINON(mess(220,191,1),WOK) From GESECRAN
            Elsif (QTY_UV>=[F:ITS]CTMQTY & [M]FMI(NOL)=2 & QTY_UV1<[F:ITS]CTMQTY)
               # Ligne gérée en contremarque directe. Voulez-vous la gérer en contremarque réceptionnée ?
               WOK=2 : Call OUINON(mess(219,191,1),WOK) From GESECRAN
            Endif
            # Bug 55476 : Kit géré en ctm : : Vérif que ts les composants st gérés en ctm
            If WOK=2 & [M]FMI(NOL)=3 & [M]LINTYP(NOL)=2
                Local Integer WFMICPE : WFMICPE=2
                Local Integer ORI     : ORI=NOL
                Gosub VERIF_KIT_CTM From TRTVENBOM : If WFMICPE=1 WOK=1 Endif
            Endif
            If WOK=2
                If QTY_UV1 >= [F:ITS]CTMQTY
                    # La ligne passe de contremarque directe en contremarque réceptionnée
                    [M]FMI(NOL) = 2
                    [M]STOMGTCOD(NOL) = 1
                Else
                    # La ligne passe de contremarque réceptionnée en contremarque directe
                    [M]FMI(NOL) = 3
                    # Reinitialisation STOMGTCOD
                    [M]STOMGTCOD(NOL) = [F:ITM]STOMGTCOD
                    If [F:ITM]STOMGTCOD <> 1
                        If [F:ITF]ITMREF<>[M]ITMREF(NOL) | [F:ITF]STOFCY<>[M]DSTOFCY(NOL)
                            Read [ITF] ITF0=[M]ITMREF(NOL);[M]DSTOFCY(NOL)
                            If fstat Raz [F:ITF] : Endif
                        Endif
                        [M]STOMGTCOD(NOL) = [F:ITF]STOMGTCOD
                    Endif
                    [M]YSTOMGTCOD(NOL) = [M]STOMGTCOD(NOL) : # Bug 55476
                Endif
            Endif
        Endif
    Endif
    Return
    #------------------------------------------------------------------------------------------------------
    # Si composé nomenclature : message avertissement si pour un composant Qté cdée < Total alloué
    # si on poursuit, la nvlle qté cdée ne sera calculée que pour les composant dt Qté cdée >= Total alloué
    #------------------------------------------------------------------------------------------------------
    $VERIF_CPSALLQTY
    
    If !find([M:SOH4]LINTYP(NOL),6) | [M:SOH4]STOMGTCOD(NOL)<>1 Return Endif
    If VALEUR=[M:SOH4]CQTY(NOL) Return Endif
    
    Local Decimal WRAPPORT, WCPSALLQTY, WCPSQTY
    Local Integer NL : NL=nolign
    Local Integer WOK : WOK=2
    
    #While [M:SOH4]LINTYP(NL)<>1 & [M:SOH4]LINTYP(NL)<>2 & [M:SOH4]LINTYP(NL)<>6 & [M:SOH4]LINTYP(NL)<>10 & NL < [M:SOH4]NBLIG
    While !find([M:SOH4]LINTYP(NL),1,2,6,10) & NL < [M:SOH4]NBLIG
        # Calcul du total alloué pour le composant
    #    WCPSALLQTY = [M:SOH4]ALLQTY(NL)+[M:SOH4]SHTQTY(NL)+[M:SOH4]ODLQTY(NL)
    #    If [M:SOH0]SOHCAT = 3
    #        WCPSALLQTY += [M:SOH4]INVQTY(NL)
    #    Else
    #        WCPSALLQTY += [M:SOH4]DLVQTY(NL)
    #    Endif
        WCPSALLQTY = [M:SOH4]TALLQTY(NL)+[M:SOH4]SHTQTY(NL)
        # Calcul de la nvelle qté cdée pour le composant
        WRAPPORT = [M:SOH4]CQTY(NL) / [M:SOH4]CQTY(NOL)
        WCPSQTY  = WRAPPORT * VALEUR
        Call QTEARR(WCPSQTY,[M:SOH4]SAU(NL)) From TRTDIV
        If WCPSQTY < WCPSALLQTY & WCPSQTY <> [M:SOH4]YQTY(NL)
            If GERR=2 GMESSAGE-="\" Endif
            # 200515 : Progress billing / X3-223270 : check control on amount message in BOM - 2020-11-25 by LD
            #GMESSAGE-=mess(312,197,1)-[M:SOH4]ITMREF(NL)-":"-mess(35,192,1)-"("-format$("N:"+GFMTQTY,num$(WCPSQTY))-"<"-format$("N:"+GFMTQTY,num$(WCPSALLQTY))-[M]SAU(NL)-")"
            GMESSAGE-=mess(7,423,1)-[M:SOH4]ITMREF(NL)-":"-mess(35,192,1)-"("-format$("N:"+GFMTQTY,num$(WCPSQTY))-"<"-format$("N:"+GFMTQTY,num$(WCPSALLQTY))-[M]SAU(NL)-")"
            # 200515 : Progress billing / X3-223270 : check control on amount message in BOM - 2020-11-25 by LD
            Call AVERTIR (GMESSAGE, WOK) From GESECRAN : Raz GMESSAGE
            If WOK=1 : Break : Endif
        Endif
        NL+=1
    Wend
    If WOK=1 mkstat=2 Endif
    Return
    
    # -------------------------------------------- #
    # Traitement d'un article géré en contremarque #
    # -------------------------------------------- #
    $INIT_WALLQTYSTU
    Local Decimal WCOEF
    
    If func MANHLDLIB.BLK_ALLOC([M:SOH1]HLDSTA,[M:SOH1]HLDCOD) : Return : Endif  # order holds
    
    # -- Si Commande non bloquée, pas en dépassement d'en-cours avec blocage
    #       Ligne ferme
    #       Article géré en stock ou composé kit/sous-traité
    # ----> Initialisation de la qté à allouer
    If  (find([M:SOH1]CDTSTA,1,4) | ([M]CDTSTA=3 & GCDTUNL=2)) & [M]DEMSTA(NOL)=1 & [M]FMI(NOL)=1 & ([M]STOMGTCOD(NOL)<>1 | find([M]LINTYP(NOL),2,10))
        # (Il faut toujours repartir des qté en US pour effectuer les calculs)
        # --- Qté à allouer = Qté déjà allouée + Reste à allouer
        [M]WALLQTYSTU(NOL) =[M]ALLQTYSTU(NOL)+([M]QTYSTU(NOL)-[M]TALLQTYSTU(NOL))
        COEF=1/WSAUSTUCOE
        Call CNVQTY([M]WALLQTYSTU(NOL),COEF,[M]SAU(NOL),[M]WALLQTY(NOL)) From TRTVENQTE
        If [M]WALLQTY(NOL)>0 & GUSERERBPC=3
            # Dde d'utilisation des réservations clients
            [M]RERBPCFLG(NOL)=1
            Local Char WVCRRER
            Local Decimal WALLCLI
            WVCRRER= vireblc(format$("K:"+num$(GLONBPC)+"X",[M]BPCORD)+format$("K:"+num$(GLONBPD)+"X",[M]DBPAADD(NOL)), 1)
            Call CAL_RERQTY(1,[M]ITMREF(NOL),[M]DSTOFCY(NOL),WVCRRER,[M]DSHIDAT(NOL),WALLCLI) From STKALL
            If WALLCLI <> 0
                GMESSAGE = mess(207,191,1)-":"-num$([M]WALLQTY(NOL))-[M]SAU(NOL)-"\"-mess(131,191,1)-num$(WALLCLI)-[M]STU(NOL)
                OK=2 : Call OUINON (GMESSAGE-"\"-mess(130,191,1),OK) From GESECRAN
                If OK = 2 [M]RERBPCFLG(NOL)=2 : Endif
            Endif
        Endif
        Affzo [M]WALLQTY(NOL)
    Endif
    
    Return
    
    # --------------------------------------------------------------------------------
    # Initialisation des dates entête commande : date expédition et date de livraison demandée
    # --------------------------------------------------------------------------------
    $INIT_DAT
    # --> Initialisation de la date d'expédition
    Local Integer WSENS
    If date$ >= [M:SOH0]ORDDAT
        [M:SOH2]SHIDAT = date$
        WSENS=0 :  # (Si indisponibilité on ne peut décaler que vers l'avant)
    Else
        [M:SOH2]SHIDAT = [M:SOH0]ORDDAT
        WSENS=1 :  # (Si indisponibilité on peut décaler vers l'arrière)
    Endif
    # --> Contrôle de la date d'expédition avec les périodes d'indisponibilités du site
    If [M:SOH2]STOFCY<>"" Call CTLUVYFCY([M:SOH2]SHIDAT, [M:SOH2]STOFCY, WSENS) From TRTVENCTL Endif
    
    # --> Calcul de la date de livraison demandée
    Call CALC_DLVDAT([M:SOH2]SHIDAT, WDAYLTI, WBPAADD, WBPCORD, 0, 0, [M:SOH2]DEMDLVDAT) From TRTVENDAT
    # Dde 19843 : Test GADJSHIDAT : Globale cachée = 1 : Pas d'ajustement date d'expédition (nvx param en V150)
    If dim(GADJSHIDAT)>0 & GADJSHIDAT=1 Raz GMESSAGE : Return Endif : # Bug 69110
    # --> Recadrage si possible de la date d'expédition par rapport à la date de livraison demandée calculée
    Local Date WSHIDAT : WSHIDAT=[M:SOH2]SHIDAT
    Call CALC_SHIDAT([M:SOH2]DEMDLVDAT, WDAYLTI, [M:SOH2]STOFCY, 1, 1, [M:SOH0]ORDDAT, WSHIDAT) From TRTVENDAT
    If WSHIDAT<=[M:SOH2]DEMDLVDAT-[M:SOH2]DAYLTI [M:SOH2]SHIDAT=WSHIDAT : Endif
    
    Raz GMESSAGE : # Bug 69110
    Return
    
    #-----------------------------------------------------------------------------------
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #############################################################################
    #    APRES_NBLIG     :    Web                                               #
    #                                                                           #
    #        Décomposée en 2 actions                                            #
    #                                                                           #
    #        1 - Traitement si fin sans validation                              #
    #          - Traitement de validation                                       #
    #          - Suppression d'un gratuit lié à une ligne                       #
    #          - Suppression d'une nomenclature                                 #
    #          - Modification d'une nomenclature si suppression du composé seul #
    #          - Modification d'une nomenclature si modification du composé     #
    #        2 - Création d'un gratuit                                          #
    #                                                                           #
    #############################################################################
    $P1_NBLIG2
    Local Integer  NOL        : NOL=nolign-1
    Local Integer  ORI        : ORI=nolign-1
    Local Integer  NL         : NL=nolign
    Local Integer  FUNCTION   : FUNCTION = 2
    Local Integer  SAVNOL, RET, OK
    
    # Bug 82658 : Recherche tarif si changement de référence article
    # Globale utilisée pour flagger les erreurs suite à la recherche tarif
    If dim(GERRITMREF)>0 Kill GERRITMREF Endif
    
    # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line              "
    If !GIMPORT and !GWEBSERV and dim([M]WSTKTXT)>0
      Raz [M]WSTKTXT : Affzo [M]WSTKTXT
      Raz [M]WALLTXT : Affzo [M]WALLTXT
    Endif
    # /User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO
    
    #---------------------------------------------------------------------------#
    # Fin sans validation : Réhabilitation des totaux et c'est tout             #
    #---------------------------------------------------------------------------#
    #If status = 6 | status = 7 | status = 27 | status = 28  | status >= 1792
    If adxgtb=1 | find(status,6,7)
        Call ADD_TOT(NOL) From SUBSOHB
        mkstat=2
        Return
    Endif
    
    #---------------------------------------------------------------------------#
    # Validation d'une ligne                                                    #
    #---------------------------------------------------------------------------#
    If GMODIF = 2 | GMODIF = 0
        GNETMAR = 1
        Call VERIF_VATCOD(NOL) From SUBSOHB
        Call APRES_LIGNE (NOL,1) From SUBSOHB
        # --> Maj du n.avenant
        If GREV=2:[M:SOH4]LINREVNUM(NOL) = [M:SOH0]REVNUM:Endif
    Endif
    
    # Raz signatures si ajout d'une ligne
    If GREP="M" & [M]CREFLG(NOL)=0 GUPDAPPFLG=2 Endif
    
    # Bug 84030
    #--------------------------------------------------------------------------------------#
    # Suppression d'une ligne de gratuit : Modification de la ligne à l'origine du gratuit #
    #--------------------------------------------------------------------------------------#
    If GMODIF = 1 & GFOCFLG = 3
      Call RAZORIGRA(NOL) From TRTVENBOM
    Endif
    #--------------------------------------------------------------------------------------#
    # Insertion d'une ligne : Maj des lignes de gratuit qui suivent la ligne insérée       #
    # Maj du n° de ligne à l'origine du gratuit car les lignes ont été renumérotées        #
    #--------------------------------------------------------------------------------------#
    If GMODIF=2 & NOL<[M]NBLIG-2
      Call MAJORIGRA(NOL,"SOPLIN") From TRTVENBOM
    Endif
    # Bug 84030
    
    #---------------------------------------------------------------------------#
    # Suppression d'un gratuit lié à une ligne supprimée                        #
    #---------------------------------------------------------------------------#
    #If (status = 65 | status = 68 | status = 83) & GFOCFLG = 2
    If (GMODIF = 1 | GMODIF = 3 | GMODIF = 4) & GFOCFLG = 2
       Call SUPGRA(NOL, FUNCTION, RET) From TRTVENBOM
       # Pb en import en suppression de ligne : affzo remet la variable status qui valait 65 à 1
       If !GIMPORT Affzo [M:SOH4]1-99 Endif
    Endif
    
    #---------------------------------------------------------------------------#
    #        Suppression d'une nomenclature                                     #
    #---------------------------------------------------------------------------#
    OK=1
    If GMODIF=4 & find([M:SOH4]LINTYP(NL), 7,8,9)
        If !GIMPORT Call OUINON(mess(13,191,1),OK) From GESECRAN : Endif
        If OK<>2
    #     ----------------------------------------------------------------------#
    #     Modification d'une nomenclature si suppression du composé seul        #
    #     ----------------------------------------------------------------------#
          Gosub MODNOM From TRTVENBOM
          GMODIF=1
          Affzo [M:SOH4]1-99
          Return
        Endif
    Endif
    If GMODIF=3 | OK=2
      Gosub SUPNOM From TRTVENBOM
      GMODIF=1
      Affzo [M:SOH4]1-99
      Return
    Endif
    
    #---------------------------------#
    # Modification d'une nomenclature #
    #---------------------------------#
    # --> Modification
    OK=1
    If GMODIF = 0
        If !GIMPORT & ([M:SOH4]LINTYP(NOL) = 6  & find([M:SOH4]LINTYP(NL), 7,8,9))
            Call OUINON(mess(14,191,1),OK) From GESECRAN
    #       MSG=Repercussion sur les composants ?
        Endif
        If find([M:SOH4]LINTYP(NOL),2,10) | OK = 2
            SAVNOL=nolign
            Gosub MODNOM From TRTVENBOM
            nolign=SAVNOL
            Affzo [M:SOH4]1-99
        Endif
        Raz GTARFLG : # Bug 62571
        # Sauvegarde nouvelle quantité pour calcul qté nomenclature
        [M]CQTY(NOL) = [M]QTY(NOL)
    Endif
    
    # 106776 -- EDI fields
    Gosub CTL_P1NBLIG From TRTFLDEDI
    
      #--The user create/modify the order                 => the $CREATION/$MODIF will instantiate
      #--Or the user wants to modify the invoice schedule => it's the TRTSAISVIC that will instantiate
      Case GMODIF
        When 0 : #--0 = Modification ligne
                 Gosub P1_NBLIG_DINVCND_UPD From LIBSAL_INVCND_SOH
                 If mkstat>0 or GERR>0 : mkstat=2 : Return : Endif
                 #--Used in LIBSAL_INVCND_SOH_BOM
                 If dim(IS_FROM_MODBOM_SET_SAME_ANSWER)>0
                   Kill IS_FROM_MODBOM_SET_SAME_ANSWER
                 Endif
        When 1 : #--1 = Suppression ligne
                 # Issue 107888 - 2016-09-09 by CPO : US155 Kit & flexible kit scheduled invoices
                 #--Used in LIBSAL_INVCND_SOH_BOM
                 If dim(IS_FROM_MODBOM_SET_SAME_ANSWER)>0
                   Kill IS_FROM_MODBOM_SET_SAME_ANSWER
                 Endif
                 #--Done in AV_NBLIG
        When 2 : #--2 = Nouvelle ligne
                 Gosub P1_NBLIG_DINVCND_INS From LIBSAL_INVCND_SOH
                 If mkstat>0 or GERR>0 : mkstat=2 : Return : Endif
    
      Endcase
    
    Return
    # End issue 107888
    #-----------------------------------------------------------------------------------
    #############################################################################
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #--nombre d'instructions trop important
    #############################################################################
    $P2_NBLIG2
    Local Integer  ORI        : ORI=nolign-1
    Local Integer  NL         : NL=nolign
    Local Integer  FUNCTION   : FUNCTION=2
    Local Integer  RET
    
    #---------------------------------------------------------------------------#
    # Création d'une ligne                                                      #
    # --> Génération des gratuits                                               #
    #---------------------------------------------------------------------------#
    If GMODIF = 2 & GFOCITMREF <> ""
        If !GIMPORT | (GIMPORT & ((dim(G_FOCFLG)>0 & G_FOCFLG=0) | (dim(G_FOCFLG)<=0)))
        #   Recherche de l'article origine si on est positionné sur un composant
            If !find([M]LINTYP(ORI),1,2,6,10)
                While !find([M]LINTYP(ORI),1,2,6,10) & ORI >= 0
                    ORI-=1
                Wend
            Endif
            # Mode web service : Pb avec les insertions de ligne
            # --> Le gratuit sera généré juste avt la création de la cde dans l'action VERIF
            #     Stockage de la référence du gratuit ds un tableau de globales
            #     Utilisation du chps [M:SOH4]FOCNUMLIG pour stocker, pour l'article à l'origine du gratuit,
            #     l'indice du gratuit ds le tableau de globales
            #     (Utiliser SOPLIN pour faire le lien n'est pas possible car à l'insertion des gratuits, tt est renuméroté)
            If dim(GWEBSERV)=1 & GWEBSERV=1
                GWEBNBGRA+=1
                GWEBFOCITMREF(GWEBNBGRA-1)=GFOCITMREF : GWEBFOCQTY(GWEBNBGRA-1)  =GFOCQTY
                GWEBFOCUOM(GWEBNBGRA-1)   =GFOCUOM    : GWEBFOCMOTIF(GWEBNBGRA-1)=GFOCMOTIF
    
                [M:SOH4]FOCNUMLIG(ORI)=GWEBNBGRA
            Else
                If !GIMPORT & ORI = [M]NBLIG [M]NBLIG +=1 : Endif
                Call CREGRA("G",1, ORI, [M:SOH0]ORDDAT, FUNCTION, NL, RET) From TRTVENBOM
                If !GIMPORT & ORI = NL-1 & ORI = [M]NBLIG - 1 :[M]NBLIG-=1:Endif
                If GIMPORT VALEUR=[M]NBLIG Endif
    
                GPOINT="CPLCREGRA" : Gosub ENTREE From EXEFNC
    
    # Test utilisation CPLCREGRA
    #Local Integer NOCPS : NOCPS=NL-1
    #Raz GBIDI1, GBIDC1
    
    #If [F:ITS]ITMREF <> [M:SOH4]ITMREF(NL-1)
    #    Read [ITM]ITM0=[M:SOH4]ITMREF(NL-1)
    #    If fstat Raz [F:ITS] : Endif
    #Endif
    #If [F:ITS]ITMTYP = 2 [M]LINTYP(NL-1) = 6 :ENDIF
    #If [F:ITS]ITMTYP = 3 [M]LINTYP(NL-1) = 2 :ENDIF
    #Call IMPCRENOM([M:SOH4]ITMREF(NL-1),NL-1,[M:SOH0]ORDDAT,2,GBIDI1,[M:SOH4]SOPLIN(NL),GBIDC1,NOCPS,GBIDI1) From TRTVENBOM
    # Test utilisation CPLCREGRA
    
                Affzo [M:SOH4]5
                If GIMPORT Return Endif : # Bug 72428
            Endif
        Endif
    Endif
    
    # 101874 : V9 : Taxe code control
    # Valuation depends on SOHVALLIG parameter
    #If dim(GVALTTCSOH)>0 & dim(GVALTTC)>0 : GVALTTC=GVALTTCSOH : Endif
    GVALTTC=GSOHVALLIG
    #If (!GIMPORT & !(dim(GWEBSERV)=1 & GWEBSERV=1)) : Call VALTTC ("GESSOH") From TRTVENFACR : Endif
    If (!GIMPORT & !(dim(GWEBSERV)=1 & GWEBSERV=1))
        #---- Paramètres complementaires appel valorisation
        # PARAM_T(0) : Flag contrôle des taxes             (1=Non/2=Oui)
        # PARAM_T(1) : Lecture de la trace par le sous-pro (1=Non/2=Oui)
        # PARAM_T(2) : Flag retour                         (1=KO/2=OK)
        Local    Char     PARAM_T (25) (0..10)
        PARAM_T(0)="1"      : # Pas de contrôle des taxes
        PARAM_T(1)="1"      : # Pas de lecture de la trace
        PARAM_T(2)="0"
        Call VALTTC ("GESSOH", PARAM_T) From TRTVENFACR
    Endif
    # 101874
    
    # Pb en import en suppression de ligne : affzo remet la variable status qui valait 65 à 1
    If !GIMPORT Affzo [M:SOH4]10,15,20 Endif
    
    Return
    #------------------------------------------------------------------------------------------------------
    # 107890 : Scheduled invoices : (LD:21/12/15)
    # -------------------------------------- NBLIG ------------------------
    Subprog B4_NBLIG2
    Local Decimal BASPAG
    # Because of the limit of the number of button, we have to use one button for severals purpose
    If [M]DLVFLG(nolign-1)=2
        # Deliverable Item  : Allocation detail
        If !GWEBSERV
         ## Action VISUDETALL
         Local Char    PARMSK(250)(1..20) , SAVACT(20)
         SAVACT = GACTION : GACTION = "VISUDETALL"
         PARMSK(1) = "SOH4"
         PARMSK(2) = [M:SOH4]DSTOFCY(nolign-1)
         PARMSK(3) = "2"
         PARMSK(4) = [M:SOH0]SOHNUM
         PARMSK(5) = num$([M:SOH4]SOPLIN(nolign-1))
         PARMSK(6) = num$([M:SOH4]SOPLIN(nolign-1))
         Call SAISIE_NUM(BASPAG,PARMSK,"IDETALL","TRTVENFEN","XWIDETALL") From GSAISIE
         GACTION = SAVACT
        Endif
        If mkstat=99 : mkstat = 0 : Elsif mkstat=0 : mkstat = 2 : Endif
    Else
        # Undeliverable Item  : Timetable (Echéancier)
        If !GWEBSERV
         ## Action SAISVIC
         Local Char    PARMSK(250)(1..20) , SAVACT(20)
         SAVACT = GACTION : GACTION = "SAISVIC"
         PARMSK(1) = "SOH4"
         PARMSK(2) = num$(nolign)
         PARMSK(3) = "10"
         PARMSK(4) = [M:SOH0]SOHNUM
         PARMSK(5) = num$([M:SOH4]SOPLIN(nolign-1))
         PARMSK(6) = num$([M:SOH4]SOPLIN(nolign-1))
         PARMSK(7) = "C_SVCRINVCND"
         PARMSK(8) = "GSOHVCRINVCND"
         Call TRAITE_NUM(BASPAG,PARMSK,"ISVIC","TRTSAISVIC","",1,"") From GTRAITE
         GACTION = SAVACT
        Endif
        If mkstat=99 : mkstat = 0 : Elsif mkstat=0 : mkstat = 2 : Endif
    Endif
    
    End
    #------------------------------------------------------------------------------------------------------
    # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line
    $DISPLAY_QTY_STOCKSTATUS2
    
    If dim([M:SOH4]WSTKTXT)<=0 : Return : Endif
    #--We stop if item not managed into stock or if import/webservice context
    If [M:SOH4]STOMGTCOD(NOL)=1 or GIMPORT or GWEBSERV:
      If dim([M:SOH4]WSTKTXT)>0
        Raz [M:SOH4]WSTKTXT
        Raz [M:SOH4]WALLTXT
        If !GIMPORT and !GWEBSERV : Affzo [M:SOH4]WSTKTXT : Affzo [M:SOH4]WALLTXT : Endif
      Endif
      Return
    Endif
    
    Raz [M:SOH4]WALLTXT
    Raz [M:SOH4]WSTKTXT
    
    #--We carry on only if the available stock block is set as displayed for the current sales order transaction
    If GSOHVALLIG<>2 : Return : Endif
    If clalev([F:SLT])=0 : Local File SALTRS [SLT] : Endif
    If [F:SLT]STRTYP<>2 or [F:SLT]STRNUM<>GFLAG
      Read [F:SLT]SLT0=2;GFLAG
      If fstat : Raz [F:SLT] : Endif
    Endif
    If [F:SLT]AVASTOCOD<>2 : Return : Endif
    
    If GREP=""
      Affzo [M:SOH4]WSTKTXT
      Affzo [M:SOH4]WALLTXT
      Return
    Endif
    
    Local Integer WRET
    Local Decimal WSTUDISSTU, WSTUDIS, WSTUDISSTU_STODISALL, WSTUDISSTU_CALFDMA
    Local Char    WNUM
    Local Char    WSTKTXTMESS(255)(0..1) : Raz WSTKTXTMESS
    Local Date    WDATE_FDMA
    Local Integer WALL
    If find(GUSERERBPC, 2,3) WNUM=vireblc(format$("K:15X",[M:SOH0]BPCORD)+format$("K:3X",[M:SOH4]DBPAADD(NOL)), 1) : Endif
    Raz WSTKTXTMESS
    Call STODISALL([M:SOH4]DSTOFCY(NOL),[M:SOH4]ITMREF(NOL),2,[M:SOH4]DALLTYP(NOL),2,2,1,"",WNUM,"",WSTUDISSTU,WRET) From STKALL
    If WRET=1 : Raz [M:SOH4]WSTKTXT : Affzo [M:SOH4]WSTKTXT : Return : Endif
    WSTUDISSTU_STODISALL = WSTUDISSTU
    If WSTUDISSTU > 0
      #--stock is available for entire quantity
      WSTUDIS=WSTUDISSTU*(1/[M:SOH4]SAUSTUCOE(NOL))
      Call QTEARR(WSTUDIS, [M:SOH4]SAU(NOL)) From TRTDIV
      WSTKTXTMESS(0) = [M:SOH4]ITMREF(NOL)-mess(47,191,1)+num$(WSTUDISSTU)-[M:SOH4]STU(NOL)-"/"+mess(380,197,1)+num$(WSTUDIS)-[M:SOH4]SAU(NOL)-mess(4,2972,1)
    Else
      WSTKTXTMESS(0) = [M:SOH4]ITMREF(NOL)-":"-mess(409,197,1)-mess(4,2972,1)
    Endif
    
    If WSTUDISSTU < 0 or WSTUDISSTU < [M:SOH4]QTYSTU(NOL)
      WDAT_FDMA = [0/0/0]
      WALL=2
      Call CAL_FDMA([M:SOH4]DSTOFCY(NOL),[M:SOH4]ITMREF(NOL),2,[M:SOH0]SOHNUM,[M:SOH4]SOPLIN(NOL),[M:SOH4]SOPLIN(NOL),WALL,[M:SOH4]QTYSTU(NOL),WSTUDISSTU,WDAT_FDMA) From STKLIB
      If WDAT_FDMA <> [0/0/0]
        If WSTUDISSTU>0
          WSTUDISSTU_CALFDMA =  WSTUDISSTU
          WSTUDIS=WSTUDISSTU*(1/[M:SOH4]SAUSTUCOE(NOL))
          Call QTEARR(WSTUDIS, [M:SOH4]SAU(NOL)) From TRTDIV
          WSTKTXTMESS(1) = mess(102,191,1)+num$(WSTUDISSTU)-[M:SOH4]STU(NOL)-"/"+mess(380,197,1)+num$(WSTUDIS)-[M:SOH4]SAU(NOL)-mess(38,197,1)-format$(GFMDAT,WDAT_FDMA)
        Endif
      Endif
    Endif
    [M:SOH4]WSTKTXT = WSTKTXTMESS(0)
    If WSTKTXTMESS(1)<>""
      [M:SOH4]WSTKTXT -= "-"-WSTKTXTMESS(1)
    Endif
    Affzo [M:SOH4]WSTKTXT
    Affzo [M:SOH4]WALLTXT
    
    Return
    # /User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO
    #------------------------------------------------------------------------------------------------------
    # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line
    $DISPLAY_ALLQTY_STOCKSTATUS2
    If dim([M:SOH4]WALLTXT)<=0 : Return : Endif
    #--We stop if item not managed into stock or if import/webservice context
    If [M:SOH4]STOMGTCOD(NOL)=1 or GIMPORT or GWEBSERV Return Endif
    
    Raz [M:SOH4]WALLTXT
    #--We carry on only if the available stock block is set as displayed for the current sales order transaction
    If GSOHVALLIG<>2 : Return : Endif
    If clalev([F:SLT])=0 : Local File SALTRS [SLT] : Endif
    If [F:SLT]STRTYP<>2 or [F:SLT]STRNUM<>GFLAG
      Read [F:SLT]SLT0=2;GFLAG
      If fstat : Raz [F:SLT] : Endif
    Endif
    If [F:SLT]AVASTOCOD<>2 : Return : Endif
    
    If GREP=""
      Raz [M:SOH4]WSTKTXT
      Affzo [M:SOH4]WSTKTXT
      Affzo [M:SOH4]WALLTXT
      Return
    Endif
    
    Local Integer WRET
    Local Decimal WSTUDISSTU, WSTUDIS, WRALQTYSTU, WXRALQTY,WXRALQTYSTU
    Local Char    WNUM
    Local Char    WSTKTXTMESS(255)(0..1) : Raz WSTKTXTMESS
    # ------------------------------------------------------------------------------- #
    #     Affichage de la quantité restant à allouer et de la quantité disponible     #
    # ------------------------------------------------------------------------------- #
    # Calcul du total alloué : à allouer + préparé + livré/facturé
    WTALLQTY = [M:SOH4]ALLQTY(NOL)+[M:SOH4]SHTQTY(NOL)+[M:SOH4]OPRQTY(NOL)+[M:SOH4]PREQTY(NOL)+[M:SOH4]ODLQTY(NOL)
    If [M:SOH0]SOHCAT = 3
        WTALLQTY += [M:SOH4]INVQTY(NOL)
    Else
        WTALLQTY += [M:SOH4]DLVQTY(NOL)
    Endif
    # Calcul du reste à allouer : Commandé - total alloué
    WRALLQTY = [M:SOH4]QTY(NOL)-WTALLQTY
    
    #--si tout est alloué, pas la peine de continuer, on raz le champ et on sort
    #If WRALLQTY<=0 : Raz [M:SOH4]WSTKTXT : Affzo [M:SOH4]WSTKTXT : Return : Endif
    
    WRALLQTYSTU = WRALLQTY*[M:SOH4]SAUSTUCOE(NOL)
    Call QTEARR(WRALQTYSTU, [M:SOH4]STU(NOL)) From TRTDIV
    
    # Calcul stock disponible
    If find(GUSERERBPC, 2,3) WNUM=vireblc(format$("K:15X",[M:SOH0]BPCORD)+format$("K:3X",[M:SOH4]DBPAADD(NOL)), 1) : Endif
    
    Call STODISALL([M:SOH4]DSTOFCY(NOL),[M:SOH4]ITMREF(NOL),2,[M:SOH4]DALLTYP(NOL),2,2,1,"",WNUM,"",WSTUDISSTU,WRET) From STKALL
    If WRET=1 : Raz [M:SOH4]WSTKTXT : Affzo [M:SOH4]WSTKTXT : Return : Endif
    #•  The stock is availabe for the whole quantity or the qtock is partially available. The following information is displayed:
    #o  'PRODUCT: Remaining quantity to be allocated in stock unit: XXXX UN / In Sales unit: YYYY SAL - Available stock XXXX UN / YYYY SAL' (UN and SAL are the unit stock and sales unit for the current
    # product)
    #• The stock is not available. The following information is displayed:
    #o  'PRODUCT: Remaining quantity to be allocated in stock unit: XXXX UN / In Sales unit: YYYY SAL - Not available'
    If WSTUDISSTU > 0
        WSTUDIS=WSTUDISSTU*(1/[M:SOH4]SAUSTUCOE(NOL))
        Call QTEARR(WSTUDIS, [M:SOH4]SAU(NOL)) From TRTDIV
        WSTKTXTMESS(0) = [M:SOH4]ITMREF(NOL)-":"-mess(46,191,1)-num$(WRALLQTYSTU)-[M:SOH4]STU(NOL)-"/"+mess(380,197,1)+num$(WRALLQTY)-[M:SOH4]SAU(NOL)-"-"-mess(163,197,1)+num$(WSTUDISSTU)-[M:SOH4]STU(NOL)
    & -"/"+mess(380,197,1)
    & +
    & num$(WSTUDIS)-[M:SOH4]SAU(NOL)
    Else
        WSTKTXTMESS(0) = [M:SOH4]ITMREF(NOL)-":"-mess(46,191,1)-num$(WRALLQTYSTU)-[M:SOH4]STU(NOL)-"/"+mess(380,197,1)+num$(WRALLQTY)-[M:SOH4]SAU(NOL)-"-"-mess(409,197,1)
    Endif
    [M:SOH4]WALLTXT = WSTKTXTMESS
    
    Affzo [M:SOH4]WALLTXT
    
    Return
    # /User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO
    #------------------------------------------------------------------------------------------------------
    
    # Issue X3-126595
    ######################################################################################
    $ECCVALMAJMIN_ENABLE2
      # FGR 01/04/2015 : X3SUIVI105605
      If [M:SOH4]TALLQTYSTU(nolign-1) > 0 Then
        mkstat = 2
      Endif
      If find([M:SOH4]LINTYP(nolign-1),3,4,5,11,12,13) Then
        mkstat = 2
      Endif
    Return
    
    # 105605 : CCM - Revision index (LD:18/06/15)
    # -------------------------------------------------- #
    #   Contrôle lié à la contremarque :                 #
    # -------------------------------------------------- #
    $ECCVALMAJMIN_CTM2
    Local Integer WOK : WOK=2
    
    If [M:SOH4]FMINUM(NOL) = "" Return Endif
    
    If [M:SOH4]FMI(NOL)=2
        # Cette ligne a fait l'objet d'une contremarque directe
        GMESSAGE = mess(270,191,1) : mkstat = 2
    Elsif [M:SOH4]FMI(NOL)=3
        # Cette ligne a fait l'objet d'une contremarque réceptionnée
        GMESSAGE = mess(271,191,1)
        If GMODU(6)=2
           Local File PORDER [POH]
           Read [POH]POH0=[M:SOH4]FMINUM(NOL)
           If fstat Raz [F:POH] Endif
           # La commande d'achat est imprimée
           If [F:POH]PRNFLG=2 GMESSAGE= GMESSAGE+"."-mess(272,191,1) Endif
        Endif
        Call AVERTIR(GMESSAGE,WOK) From GESECRAN
        Raz GMESSAGE
        If WOK=1 mkstat=2 Endif
    Elsif [M:SOH4]FMI(NOL)=5
        # Cette ligne a fait l'objet d'une ordre de fabrication
        GMESSAGE = mess(269,191,1) : mkstat = 2
    Endif
    
    Return
    # 105605 : CCM - Revision index (LD:18/06/15)
    ######################################################################################
    # pour la navigation vers le plan d'affectation
    $MEM_VCR2
    If find(GREP,"C","D")
        If dim(GVCR)=1 : # If dim(GVCR) : # GH 24/10/12 bug 85427
            Raz GVCR, GLIN, GSEQ
        Endif
        Return
    Endif
    If dim(GVCR) < 0
        Global Char    GVCR
        Global Integer GLIN
        Global Integer GSEQ
    Endif
    
    GVCR = [M:SOH0]SOHNUM
    GLIN = [M:SOH4]SOPLIN(nolign-1)
    GSEQ = [M:SOH4]SOPLIN(nolign-1)
    Return
    
    # --------------------------------------------------------------------------------
    # Affichage des champs suite à la recherche tarif
    # --------------------------------------------------------------------------------
    $AFF_RECH_TAR2
    
    If dim(GWEBSERV)=1 & GWEBSERV=1 Return Endif
    
    Affzo [M:SOH4]GROPRI(NOL)
    If dim([M:SOH4]DISCRGVAL1(NOL))>0 Affzo [M:SOH4]DISCRGVAL1(NOL) Endif
    If dim([M:SOH4]DISCRGVAL2(NOL))>0 Affzo [M:SOH4]DISCRGVAL2(NOL) Endif
    If dim([M:SOH4]DISCRGVAL3(NOL))>0 Affzo [M:SOH4]DISCRGVAL3(NOL) Endif
    If dim([M:SOH4]DISCRGVAL4(NOL))>0 Affzo [M:SOH4]DISCRGVAL4(NOL) Endif
    If dim([M:SOH4]DISCRGVAL5(NOL))>0 Affzo [M:SOH4]DISCRGVAL5(NOL) Endif
    If dim([M:SOH4]DISCRGVAL6(NOL))>0 Affzo [M:SOH4]DISCRGVAL6(NOL) Endif
    If dim([M:SOH4]DISCRGVAL7(NOL))>0 Affzo [M:SOH4]DISCRGVAL7(NOL) Endif
    If dim([M:SOH4]DISCRGVAL8(NOL))>0 Affzo [M:SOH4]DISCRGVAL8(NOL) Endif
    If dim([M:SOH4]DISCRGVAL9(NOL))>0 Affzo [M:SOH4]DISCRGVAL9(NOL) Endif
    Affzo [M:SOH4]REPCOE(NOL)
    Affzo [M:SOH4]NETPRI(NOL)
    
    Return
    # End issue X3-126595
    
    # 139565 : Milestone billing / X3-185425 - 2020-03-19 by LD
    # Pour une ligne de commande avec echeancier, controle qu'un code PJT est compatible avec les jalons liés aux lignes d'échéancier
    # Ctrl ssi code activité "PJM" actif
    # For a line with schedule invoices, control that a PJT code is compatible with the milestones linked to the schedule invoices
    # Control only if "PJM" code activity active
    $CTL_PJT_COMPATIBILITY2
    Local Integer WOK : WOK=2
    
    If !func ASYRFNC.ACTIV("PJM") Return Endif
    Local Integer IRET
    
    # Racine nouveau PJT
    # Root new PJT
    Local Char WNEWPROJECT(GLONPIM)
    Local Char WNEWBUDGET(GLONPBU)
    Local Char WNEWTASK(GLONTAC)
    IRET = func PIMPL_CSTD_PROGS.PJM_KEY_SPLIT(GACTX, WNEWPJT, WNEWPROJECT, WNEWBUDGET, WNEWTASK)
    # L'ancien code PJT était vide et il a été renseigné
    # The old PJT code was empty and it has been fed
    # Issue X3-110981/189977 - 2020-06-10 by MUARN : strict control of PJT
    #If WOLDPJT=""
    #    Call AVERTIR (mess (289, 191,1)-WNEWPROJECT, WOK) From GESECRAN
    #    If WOK=1 WRET = [V]CST_AERROR Endif
    #    Return
    #Endif
    
    # Le code PJT a été modifié : A-t-il la même racine ?
    # The PJT code has been modified : Does it have the same root ?
    # Racine ancien  PJT
    # Root old PJT
    Local Char WOLDPROJECT(GLONPIM)
    Local Char WOLDBUDGET(GLONPBU)
    Local Char WOLDTASK(GLONTAC)
    IRET = func PIMPL_CSTD_PROGS.PJM_KEY_SPLIT(GACTX, WOLDPJT, WOLDPROJECT, WOLDBUDGET, WOLDTASK)
    If WOLDPROJECT=WNEWPROJECT Return Endif
    
    # Issue X3-110981/189977 - 2020-06-10 by MUARN : strict control of PJT
    # Le nouveau PJT n'a pas la même racine
    # The new PJT does not have the same root
    #Call AVERTIR (mess (289, 191,1)-WNEWPROJECT, WOK) From GESECRAN
    #If WOK=1 WRET = [V]CST_AERROR Endif
    
    # Issue X3-110981/189977 - 2020-06-10 by MUARN : strict control of PJT
    Raz GERR
    Gosub AM_DPJT_PJTMST_CTRL From LIBSAL_INVCND_SOH
    If GERR=1 : WRET = [V]CST_AERROR : mkstat=2 : Endif
    # End issue X3-110981/189977
    
    Return
    # 139565 : Milestone billing / X3-185425 - 2020-03-19 by LD
    
    
    
    # Issue X3-110981/189977 - 2020-06-10 by MUARN : strict control of PJT
    Subprog C_PJT3(VALEUR)
    Variable Char    VALEUR()
    #!!!!!!!!
    # BE CARFUL
    # same process in INIITMORI from TRTVENBOM
    
    # the check of strit control of PJT must be done here in C_PJT and not in AM_PJT
    # to check before the question data type to modify the line
    # so if no modification no control
    If VALEUR=[M:SOH1]PJT : End : Endif
    
    If [M:SOH4]NBLIG = 0 : End : Endif
    
    If !func ASYRFNC.ACTIV("PJM") : End : Endif
    
    Local Integer IRET
    
    Local Integer WRET : Raz WRET
    Local Char WOLDPJT(GLONPJT) : WOLDPJT=[M:SOH1]PJT
    Local Char WNEWPJT(GLONPJT) : WNEWPJT=VALEUR
    
    Local Char WNEWPROJECT(GLONPIM)
    Local Char WNEWBUDGET(GLONPBU)
    Local Char WNEWTASK(GLONTAC)
    IRET = func PIMPL_CSTD_PROGS.PJM_KEY_SPLIT(GACTX, WNEWPJT, WNEWPROJECT, WNEWBUDGET, WNEWTASK)
    
    Local Char WOLDPROJECT(GLONPIM)
    Local Char WOLDBUDGET(GLONPBU)
    Local Char WOLDTASK(GLONTAC)
    IRET = func PIMPL_CSTD_PROGS.PJM_KEY_SPLIT(GACTX, WOLDPJT, WOLDPROJECT, WOLDBUDGET, WOLDTASK)
    # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan - 2020-07-16 by LD
    #If WOLDPROJECT=WNEWPROJECT : End :  Endif
    # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan - 2020-07-16 by LD
    
    Gosub C_PJT_PJTMST_CTRL From LIBSAL_INVCND_SOH
    # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan - 2020-07-16 by LD
    If GERR=1 mkstat=2 : Raz GERR Endif
    #If GERR = 1
    #  Local Integer WOK
    #  If GPJTSNGDOC = G_NON Then
    #    WOK=2
    #    Call AVERTIR (GMESSAGE, WOK) From GESECRAN
    #  Else
    #    WOK=1
    #    Call ERREUR(GMESSAGE) From GESECRAN
    #  Endif
    #  Raz GERR, GMESSAGE
    #  If WOK = 1
    #    mkstat=2
    #  Endif
    #Endif
    # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan - 2020-07-16 by LD
    
    End
    
    
    
    #############################################################################################
    #                                                                                           #
    # SUBSOH1 : TRAITEMENTS STANDARDS UTILISES DANS LES COMMANDES DE VENTE                      #
    #                                                                                           #
    #############################################################################################
    #############################################################################################
    #                                                                                           #
    # Etiquettes appelées par TRTSTOALLA                                                        #
    #                                                                                           #
    #  $CHARGE_STOALL : Chargement des paramètres dans masque STOALL                            #
    #  $AVANT_STOALL  : Contrôle avant enregistrement                                           #
    #  $APRES_STOALL  : Mise à jour complémentaires après enregistrement                        #
    #############################################################################################
    #                                                                                                       #
    # Etiquettes/sous-pro appelées par SUBSOH                                                               #
    #                                                                                                       #
    #  $TRT_CTM         : Traitement d'un article géré en contremarque                                      #
    #  $VERIF_CPSALLQTY : Si composé nomenclature : msg avert. si pour un composant Qté cdée < Total alloué #
    #  $INIT_WALLQTYSTU : Traitement d'un article géré en contremarque                                      #
    #  $INIT_DAT        : Initialisation des dates entête commande : date expédition et date de livraison demandée #
    #
    #  $P1_NBLIG
    #  $P2_NBLIG
    #  B4_NBLIG
    #  $ECCVALMAJMIN_ENABLE                                                                     # Issue X3-126595
    #  $ECCVALMAJMIN_CTM                                                                        # Issue X3-126595
    #  $MEM_VCR                                                                                 # Issue X3-126595
    #  $AFF_RECH_TAR                                                                            # Issue X3-126595
    #  $CTL_PJT_COMPATIBILITY                                                                   # 139565 : Milestone billing / X3-185425 - 2020-03-19 by LD
    #########################################################################################################
    # Issue X3-126595 - 20190213 by LD : Error in prices for the options in a kit when the sales order is created via a webservice
    
    #---------------------------------------------------------------------- #
    # Chargement des paramètres dans masque STOALL                          #
    # Cette étiquette est appelée depuis CHARGE_PARAM From TRTSTOALLA       #
    #---------------------------------------------------------------------- #
    $CHARGE_STOALL3
    
    # Chargement du masque [M:ALL]
    Local Decimal WTOT, WTOTSTU
    #Local Char    LWRH(GLONWRH)
    #Local Integer LEXC
    
    Raz [M:ALL]
    [M:ALL]VCRTYP=2
    [M:ALL]VCRNUM=[M:SOH0]SOHNUM
    [M:ALL]VCRLIN=[M:SOH4]SOPLIN (LNOL)
    [M:ALL]VCRSEQ=[M:SOH4]SOPLIN (LNOL)
    [M:ALL]PCU=[M:SOH4]SAU (LNOL)
    [M:ALL]STU=[M:SOH4]STU (LNOL)
    [M:ALL]PCUSTUCOE=[M:SOH4]SAUSTUCOE (LNOL)
    [M:ALL]BPCORD=[M:SOH0]BPCORD
    [M:ALL]BPAADD=[M:SOH4]DBPAADD(LNOL)
    # Quantité besoin en allocation = commandé - déjà préparé/livré/facturé
    # Recalcul du déjà préparé/livré/facturé
    WTOTLIV=[M:SOH4]TALLQTYSTU(LNOL) - [M:SOH4]ALLQTYSTU(LNOL)
    [M:ALL]RETQTY = [M:SOH4]QTYSTU(LNOL) - WTOTLIV
    If [M:ALL]RETQTY < 0 [M:ALL]RETQTY = 0 Endif
    [M:ALL]OLDALLQTY = [M:SOH4]ALLQTYSTU(LNOL)
    [M:ALL]SHTQTY = [M:SOH4]SHTQTYSTU(LNOL)
    # Alimentation de la qté à allouer
    [M:ALL]QTYTOALL  = [M:SOH4]WALLQTYSTU(LNOL)
    # Alimentation de la qté déjà allouée en global
    Raz [M:ALL]GLOALLQTY : If [M:SOH4]DALLTYP(LNOL)=1 [M:ALL]GLOALLQTY=[M:SOH4]ALLQTYSTU(LNOL) Endif
    
    [M:ALL]ALLTYP = [M:SOH4]DALLTYP(LNOL)
    # 88827 : La date besoin doit tjs être alimentée avec la date d'expédition pour respecter l'ordre chronologique des ddes d'allocation
    #[M:ALL]RETDAT = max(date$, [M:SOH4]DSHIDAT(LNOL))
    [M:ALL]RETDAT = [M:SOH4]DSHIDAT(LNOL)
    # 88827
    [M:ALL]DLVDAT = max(date$, [M:SOH4]EXTDLVDAT(LNOL))
    [M:ALL]PECINTLOC = 2
    [M:ALL]PECPLFLOC = 2    : # Prise en cpte empl quai : Oui
    [M:ALL]XLOT   = [M:SOH4]LOT(LNOL)
    [M:ALL]XLOC   = [M:SOH4]LOC(LNOL)
    [M:ALL]XSTA   = [M:SOH4]STA(LNOL)
    # FGR 04/05/2015 : X3SUIVI105605 (début)
    If dim([M:SOH4]ECCVALMAJ) >= 0 Then
      [M:ALL]WECCVALMAJ = [M:SOH4]ECCVALMAJ(LNOL)
    Endif
    # FGR 04/05/2015 : X3SUIVI105605 (fin)
    GTYPLIG=0
    If find([M:SOH4]LINTYP(LNOL),3,4,5,11,12,13)  GTYPLIG=1 Endif
    If find([M:SOH4]FMI(LNOL), 3,5)               GTYPLIG=2 Endif
    
    If find([M:SOH4]LINTYP(LNOL),3,4,5,11,12,13)  Diszo [M:ALL]QTYTOALL Endif
    
    # Récupération du paramêtre stock : Génération de ruptures
    Local Char     WPARAM(10)
    Call PARAML([M:SOH4]DSTOFCY(LNOL),"GENSHT",WPARAM) From ADOVAL      # FGR 28/07/2015 : X3SUIVI108078 : Plus Call PARAM (performances)
    GGENSHT=val(WPARAM)
    # Commande de prêt
    If [M:SOH0]SOHCAT=2
       GPRET = 1
    Else
       GPRET = 0
    Endif
    
    Return
    
    #---------------------------------------------------------------------- #
    # Contrôle avant enregistrement                                         #
    # Si contrôle non OK, mettre OK=0 pour ne pas enregister                #
    # Cette étiquette est appelée depuis AVANT_ENR From TRTSTOALLA          #
    #---------------------------------------------------------------------- #
    $AVANT_STOALL3
    
    # Quantité totale <> quantité à allouer
    If [M:ALL]PECQTY < [M:ALL]QTYTOALL
        OK = 2
    #   Livraison ligne/cde complète : On doit tout allouer
        If find([M:SOH2]DME,2,3)
            Call OUINON(mess(107,191,1),OK) From GESECRAN
        Endif
        If OK <> 2 FOK=0 : Return : Endif
    Endif
    
    Return
    
    #---------------------------------------------------------------------- #
    # Mise à jour complémentaires après enregistrement                      #
    # Si problème mettre GOK=0 pour annuler l'enregistrement                #
    # Cette étiquette est appelée depuis APRES_ENR From TRTSTOALLA          #
    #---------------------------------------------------------------------- #
    $APRES_STOALL3
    Local Integer NL, WRET
    Local Decimal WALLSTU
    Local Char    WTRTLIG(1)
    
    #[M:ALL]ALLTYP=2
    
    If WCSOQTY<>0
        Local Char WVCRRER
        WVCRRER = format$("K:"+num$(GLONBPC)+"X", [M:ALL]BPCORD)+format$("K:"+num$(GLONBPD)+"X", [M:ALL]BPAADD)
        WVCRRER = vireblc(WVCRRER, 1)
        # Si consommation des réservations clients : Maj de l'encours correspondant
        Call MAJORDBPC(1,WVCRRER,[M:SOH4]ITMREF(LNOL),[M:SOH4]DSTOFCY(LNOL),WCSOQTY,WRET) From TRTVENALL
        If WRET <> 0 GOK=0 : Return Endif
    Endif
    #   Mise à jour commande
    Call MAJALLORD([M:ALL]VCRNUM, [M:ALL]VCRLIN, [M:ALL]VCRSEQ, [M:ALL]ALLTYP, 1, WALLQTY, WSHTQTY, WRET) From TRTVENALL
    If WRET <> 0 : GOK = 0 : Return : Endif
    #   Si Composé de kit, il faut allouer les composants
    WALLSTU=WALLQTY+WSHTQTY
    WALLSTU=WALLSTU-([M:SOH4]ALLQTYSTU(LNOL)+[M:SOH4]SHTQTYSTU(LNOL))
    Raz WTRTLIG
    If find([M:SOH4]LINTYP(LNOL),2,10) & WALLSTU <> 0
        If WALLSTU < 0
    # ----- C'est une diminution/annulation de l'allocation
            WTRTLIG = "D"
            WALLSTU = abs(WALLSTU)
        Elsif WALLSTU > 0
    # ----- C'est une augmentation de l'allocation
            If [M:SOH4]ALLQTYSTU(LNOL) = 0 & [M:SOH4]SHTQTYSTU(LNOL) = 0
                 WTRTLIG = "C"
            Else
                 WTRTLIG = "M"
            Endif
            WALLSTU=WALLQTY+WSHTQTY
        Endif
        Call GENALLKIT ([M:ALL]VCRNUM, [M:ALL]VCRLIN, [M:ALL]VCRSEQ, WTRTLIG, GRERBPC, 2, 0, 1, 0, WALLSTU,
    &                   WRET) From TRTVENALL
        If WRET <> 0 GOK=0 : Return : Endif
    Endif
    #    Réaffichage du masque [M:SOH4]
    If [F:SOH]SOHNUM <> [M:SOH0]SOHNUM
        Read [SOH]SOH0=[M:SOH0]SOHNUM
        If fstat : Return : Endif
    Endif
    [M:SOH1]ALLSTA = [F:SOH]ALLSTA
    
    If [F:SOQ]SOHNUM<>[M:SOH0]SOHNUM | [F:SOQ]SOPLIN<>[M:SOH4]SOPLIN(LNOL) | [F:SOQ]SOQSEQ<>[M:SOH4]SOPLIN(LNOL)
        Read [SOQ]SOQ0=[M:SOH0]SOHNUM;[M:SOH4]SOPLIN(LNOL);[M:SOH4]SOPLIN(LNOL)
        If fstat : Return : Endif
    Endif
    [M:SOH4]ALLQTY(LNOL)    = [F:SOQ]ALLQTY
    [M:SOH4]ALLQTYSTU(LNOL) = [F:SOQ]ALLQTYSTU
    [M:SOH4]SHTQTY(LNOL)    = [F:SOQ]SHTQTY
    [M:SOH4]SHTQTYSTU(LNOL) = [F:SOQ]SHTQTYSTU
    [M:SOH4]DALLTYP(LNOL)   = [F:SOQ]ALLTYP
    
    [M:SOH4]TALLQTYSTU(LNOL) = sum([F:SOQ]ALLQTYSTU,[F:SOQ]ODLQTYSTU,[F:SOQ]OPRQTYSTU,[F:SOQ]PREQTYSTU)
    [M:SOH4]TALLQTY(LNOL)    = sum([F:SOQ]ALLQTY,[F:SOQ]ODLQTY,[F:SOQ]OPRQTY,[F:SOQ]PREQTY)
    If [M:SOH0]SOHCAT = 3
        [M:SOH4]TALLQTYSTU(LNOL) += [F:SOQ]INVQTYSTU
        [M:SOH4]TALLQTY(LNOL)    += [F:SOQ]INVQTY
    Else
        [M:SOH4]TALLQTYSTU(LNOL) += [F:SOQ]DLVQTYSTU
        [M:SOH4]TALLQTY(LNOL)    += [F:SOQ]DLVQTY
    Endif
    # --- Qté à allouer = Qté déjà allouée
    [M:SOH4]WALLQTY(LNOL)   = [F:SOQ]ALLQTY + [F:SOQ]SHTQTY
    [M:SOH4]WALLQTYSTU(LNOL)= [F:SOQ]ALLQTYSTU + [F:SOQ]SHTQTYSTU
    [M:SOH4]YALLQTY(LNOL)   = [M:SOH4]ALLQTY(LNOL)
    [M:SOH4]YSHTQTY(LNOL)   = [M:SOH4]SHTQTY(LNOL)
    
    Raz [M:SOH4]DLBQTYSTU (LNOL)
    # Si kit/sous-traité, sauvegarde de l'indice du kit et de la qté cdée pour calcul qté livrable
    If find([M:SOH4]LINTYP(LNOL),2,10)
        Local Decimal WKIT_QTYSTU  : Raz WKIT_QTYSTU
        If [M:SOH4]ALLQTYSTU(LNOL)<>0
            WKIT_QTYSTU=[M:SOH4]QTYSTU(LNOL)
            [M:SOH4]DLBQTYSTU(LNOL)=[M:SOH4]ALLQTYSTU(LNOL)
        Endif
    Endif
    
    Affzo [M:SOH1]ALLSTA
    If find([M:SOH4]LINTYP(LNOL),2,10) & WTRTLIG<>""
    #   composé kit ou sous-traité : il faut réafficher tous les composants
        NL=LNOL+1
        While find([M:SOH4]LINTYP(NL),3,4,5,11,12,13) & NL < [M:SOH4]NBLIG
            Read [SOQ]SOQ0=[M:SOH0]SOHNUM;[M:SOH4]SOPLIN(NL);[M:SOH4]SOPLIN(NL)
            If fstat : Break : Endif
            [M:SOH4]ALLQTY(NL)    = [F:SOQ]ALLQTY
            [M:SOH4]ALLQTYSTU(NL) = [F:SOQ]ALLQTYSTU
            [M:SOH4]SHTQTY(NL)    = [F:SOQ]SHTQTY
            [M:SOH4]SHTQTYSTU(NL) = [F:SOQ]SHTQTYSTU
            [M:SOH4]DALLTYP(NL)   = [F:SOQ]ALLTYP
            [M:SOH4]TALLQTYSTU(NL)= sum([F:SOQ]ALLQTYSTU,[F:SOQ]ODLQTYSTU,[F:SOQ]OPRQTYSTU,[F:SOQ]PREQTYSTU)
            [M:SOH4]TALLQTY(NL)   = sum([F:SOQ]ALLQTY,[F:SOQ]ODLQTY,[F:SOQ]OPRQTY,[F:SOQ]PREQTY)
            If [M:SOH0]SOHCAT = 3
                [M:SOH4]TALLQTYSTU(NL) += [F:SOQ]INVQTYSTU
                [M:SOH4]TALLQTY(NL)    += [F:SOQ]INVQTY
            Else
                [M:SOH4]TALLQTYSTU(NL) += [F:SOQ]DLVQTYSTU
                [M:SOH4]TALLQTY(NL)    += [F:SOQ]DLVQTY
            Endif
            # --- Qté à allouer = Qté déjà allouée
            [M:SOH4]WALLQTY(NL)        = [F:SOQ]ALLQTY + [F:SOQ]SHTQTY
            [M:SOH4]WALLQTYSTU(NL)     = [F:SOQ]ALLQTYSTU + [F:SOQ]SHTQTYSTU
            [M:SOH4]YALLQTY(NL)   = [M:SOH4]ALLQTY(NL)
            [M:SOH4]YSHTQTY(NL)   = [M:SOH4]SHTQTY(NL)
    
            # Si composant de kit en rupture, calcul de la qté livrable pour le kit
            # --- Qté livrable = Qté allouée du kit - Qté Rupture ramenée au niveau kit
            If dim(WKIT_QTYSTU)>0 & WKIT_QTYSTU<>0 & [M:SOH4]SHTQTYSTU(NL)>0
                Local Decimal WRAPPORT : WRAPPORT=WKIT_QTYSTU / [M:SOH4]QTYSTU(NL)
                Local Decimal WDLBQTYSTU : WDLBQTYSTU=[M:SOH4]WALLQTYSTU(LNOL)-arr([M:SOH4]SHTQTYSTU(NL)*WRAPPORT,0.000001)
                If WDLBQTYSTU<[M:SOH4]DLBQTYSTU(LNOL) [M:SOH4]DLBQTYSTU(LNOL)=WDLBQTYSTU Endif
            Endif
    
            Affzo [M:SOH4]ALLQTY(NL), SHTQTY(NL), WALLQTY(NL)
            NL+=1
        Wend
    Endif
    Affzo [M:SOH4]ITMREF(LNOL), ALLQTY(LNOL), SHTQTY(LNOL), WALLQTY(LNOL), DALLTYP(LNOL)
    
    # Si kit/sous-traité, affichage de la qté livrable
    If !find([M:SOH4]LINTYP(LNOL),2,10) Return Endif
    GERR=4: GMESSAGE="                                  "
    If [M:SOH4]DLBQTYSTU(LNOL)<[M:SOH4]WALLQTYSTU(LNOL)
        Local Decimal WDLBQTY
        If [M:SOH4]SAUSTUCOE(LNOL)<>1
            WDLBQTY=[M:SOH4]DLBQTYSTU(LNOL)*(1/[M:SOH4]SAUSTUCOE(LNOL))
        Else
            WDLBQTY=[M:SOH4]DLBQTYSTU(LNOL)
        Endif
        Call QTEARR(WDLBQTY, [M:SOH4]SAU(LNOL)) From TRTDIV
        GMESSAGE=(mess(610,197,1)-num$(WDLBQTY)-[M:SOH4]SAU(LNOL))
    Endif
    
    Return
    # -------------------------------------------- #
    # Traitement d'un article géré en contremarque #
    # -------------------------------------------- #
    $TRT_CTM3
    
    If [F:ITS]CTMQTY > 0
        If GMODIF = 2 & [M]FMI(NOL)=3 & [M]LINTYP(NOL)<>2 : # Bug 55476
            # Création d'une ligne
            If [M:SOH4]SAU(NOL) <> [F:ITM]SAU
                 Call SCAL_QUV(VALEUR, [M:SOH4]ITMREF(NOL),[M]BPCORD,[M:SOH4]SAU(NOL),[F:ITM]SAU, QTY_UV, GBIDD1) From TRTVENQTE
            Else
                 QTY_UV = VALEUR
            Endif
            # -->  On regarde si ctm directe
            If QTY_UV >= [F:ITS]CTMQTY
                [M]FMI(NOL) = 2
                [M]STOMGTCOD(NOL) = 1
            Endif
        Elsif GMODIF = 0 & find([M]FMI(NOL), 2,3) & [M]FMINUM(NOL)=""
            # Modification d'une ligne
            If [M:SOH4]SAU(NOL) <> [F:ITM]SAU
                 Call SCAL_QUV([M]QTY(NOL), [M:SOH4]ITMREF(NOL),[M]BPCORD,[M:SOH4]SAU(NOL),[F:ITM]SAU, QTY_UV,  GBIDD1) From TRTVENQTE
                 Call SCAL_QUV(VALEUR,      [M:SOH4]ITMREF(NOL),[M]BPCORD,[M:SOH4]SAU(NOL),[F:ITM]SAU, QTY_UV1, GBIDD1) From TRTVENQTE
            Else
                 QTY_UV  = [M]QTY(NOL)
                 QTY_UV1 = VALEUR
            Endif
            # Si FMI était en concordance avec la qté cdée et la qté cdée a été modifiée : Faut-il réajuster FMI ?
            Local Integer WOK : WOK=1
            If    (QTY_UV< [F:ITS]CTMQTY & [M]FMI(NOL)=3 & QTY_UV1>=[F:ITS]CTMQTY)
               # Ligne gérée en contremarque réceptionnée. Voulez-vous la gérer en contremarque directe ?
               WOK=2 : Call OUINON(mess(220,191,1),WOK) From GESECRAN
            Elsif (QTY_UV>=[F:ITS]CTMQTY & [M]FMI(NOL)=2 & QTY_UV1<[F:ITS]CTMQTY)
               # Ligne gérée en contremarque directe. Voulez-vous la gérer en contremarque réceptionnée ?
               WOK=2 : Call OUINON(mess(219,191,1),WOK) From GESECRAN
            Endif
            # Bug 55476 : Kit géré en ctm : : Vérif que ts les composants st gérés en ctm
            If WOK=2 & [M]FMI(NOL)=3 & [M]LINTYP(NOL)=2
                Local Integer WFMICPE : WFMICPE=2
                Local Integer ORI     : ORI=NOL
                Gosub VERIF_KIT_CTM From TRTVENBOM : If WFMICPE=1 WOK=1 Endif
            Endif
            If WOK=2
                If QTY_UV1 >= [F:ITS]CTMQTY
                    # La ligne passe de contremarque directe en contremarque réceptionnée
                    [M]FMI(NOL) = 2
                    [M]STOMGTCOD(NOL) = 1
                Else
                    # La ligne passe de contremarque réceptionnée en contremarque directe
                    [M]FMI(NOL) = 3
                    # Reinitialisation STOMGTCOD
                    [M]STOMGTCOD(NOL) = [F:ITM]STOMGTCOD
                    If [F:ITM]STOMGTCOD <> 1
                        If [F:ITF]ITMREF<>[M]ITMREF(NOL) | [F:ITF]STOFCY<>[M]DSTOFCY(NOL)
                            Read [ITF] ITF0=[M]ITMREF(NOL);[M]DSTOFCY(NOL)
                            If fstat Raz [F:ITF] : Endif
                        Endif
                        [M]STOMGTCOD(NOL) = [F:ITF]STOMGTCOD
                    Endif
                    [M]YSTOMGTCOD(NOL) = [M]STOMGTCOD(NOL) : # Bug 55476
                Endif
            Endif
        Endif
    Endif
    Return
    #------------------------------------------------------------------------------------------------------
    # Si composé nomenclature : message avertissement si pour un composant Qté cdée < Total alloué
    # si on poursuit, la nvlle qté cdée ne sera calculée que pour les composant dt Qté cdée >= Total alloué
    #------------------------------------------------------------------------------------------------------
    $VERIF_CPSALLQTY3
    
    If !find([M:SOH4]LINTYP(NOL),6) | [M:SOH4]STOMGTCOD(NOL)<>1 Return Endif
    If VALEUR=[M:SOH4]CQTY(NOL) Return Endif
    
    Local Decimal WRAPPORT, WCPSALLQTY, WCPSQTY
    Local Integer NL : NL=nolign
    Local Integer WOK : WOK=2
    
    #While [M:SOH4]LINTYP(NL)<>1 & [M:SOH4]LINTYP(NL)<>2 & [M:SOH4]LINTYP(NL)<>6 & [M:SOH4]LINTYP(NL)<>10 & NL < [M:SOH4]NBLIG
    While !find([M:SOH4]LINTYP(NL),1,2,6,10) & NL < [M:SOH4]NBLIG
        # Calcul du total alloué pour le composant
    #    WCPSALLQTY = [M:SOH4]ALLQTY(NL)+[M:SOH4]SHTQTY(NL)+[M:SOH4]ODLQTY(NL)
    #    If [M:SOH0]SOHCAT = 3
    #        WCPSALLQTY += [M:SOH4]INVQTY(NL)
    #    Else
    #        WCPSALLQTY += [M:SOH4]DLVQTY(NL)
    #    Endif
        WCPSALLQTY = [M:SOH4]TALLQTY(NL)+[M:SOH4]SHTQTY(NL)
        # Calcul de la nvelle qté cdée pour le composant
        WRAPPORT = [M:SOH4]CQTY(NL) / [M:SOH4]CQTY(NOL)
        WCPSQTY  = WRAPPORT * VALEUR
        Call QTEARR(WCPSQTY,[M:SOH4]SAU(NL)) From TRTDIV
        If WCPSQTY < WCPSALLQTY & WCPSQTY <> [M:SOH4]YQTY(NL)
            If GERR=2 GMESSAGE-="\" Endif
            # 200515 : Progress billing / X3-223270 : check control on amount message in BOM - 2020-11-25 by LD
            #GMESSAGE-=mess(312,197,1)-[M:SOH4]ITMREF(NL)-":"-mess(35,192,1)-"("-format$("N:"+GFMTQTY,num$(WCPSQTY))-"<"-format$("N:"+GFMTQTY,num$(WCPSALLQTY))-[M]SAU(NL)-")"
            GMESSAGE-=mess(7,423,1)-[M:SOH4]ITMREF(NL)-":"-mess(35,192,1)-"("-format$("N:"+GFMTQTY,num$(WCPSQTY))-"<"-format$("N:"+GFMTQTY,num$(WCPSALLQTY))-[M]SAU(NL)-")"
            # 200515 : Progress billing / X3-223270 : check control on amount message in BOM - 2020-11-25 by LD
            Call AVERTIR (GMESSAGE, WOK) From GESECRAN : Raz GMESSAGE
            If WOK=1 : Break : Endif
        Endif
        NL+=1
    Wend
    If WOK=1 mkstat=2 Endif
    Return
    
    # -------------------------------------------- #
    # Traitement d'un article géré en contremarque #
    # -------------------------------------------- #
    $INIT_WALLQTYSTU3
    Local Decimal WCOEF
    
    If func MANHLDLIB.BLK_ALLOC([M:SOH1]HLDSTA,[M:SOH1]HLDCOD) : Return : Endif  # order holds
    
    # -- Si Commande non bloquée, pas en dépassement d'en-cours avec blocage
    #       Ligne ferme
    #       Article géré en stock ou composé kit/sous-traité
    # ----> Initialisation de la qté à allouer
    If  (find([M:SOH1]CDTSTA,1,4) | ([M]CDTSTA=3 & GCDTUNL=2)) & [M]DEMSTA(NOL)=1 & [M]FMI(NOL)=1 & ([M]STOMGTCOD(NOL)<>1 | find([M]LINTYP(NOL),2,10))
        # (Il faut toujours repartir des qté en US pour effectuer les calculs)
        # --- Qté à allouer = Qté déjà allouée + Reste à allouer
        [M]WALLQTYSTU(NOL) =[M]ALLQTYSTU(NOL)+([M]QTYSTU(NOL)-[M]TALLQTYSTU(NOL))
        COEF=1/WSAUSTUCOE
        Call CNVQTY([M]WALLQTYSTU(NOL),COEF,[M]SAU(NOL),[M]WALLQTY(NOL)) From TRTVENQTE
        If [M]WALLQTY(NOL)>0 & GUSERERBPC=3
            # Dde d'utilisation des réservations clients
            [M]RERBPCFLG(NOL)=1
            Local Char WVCRRER
            Local Decimal WALLCLI
            WVCRRER= vireblc(format$("K:"+num$(GLONBPC)+"X",[M]BPCORD)+format$("K:"+num$(GLONBPD)+"X",[M]DBPAADD(NOL)), 1)
            Call CAL_RERQTY(1,[M]ITMREF(NOL),[M]DSTOFCY(NOL),WVCRRER,[M]DSHIDAT(NOL),WALLCLI) From STKALL
            If WALLCLI <> 0
                GMESSAGE = mess(207,191,1)-":"-num$([M]WALLQTY(NOL))-[M]SAU(NOL)-"\"-mess(131,191,1)-num$(WALLCLI)-[M]STU(NOL)
                OK=2 : Call OUINON (GMESSAGE-"\"-mess(130,191,1),OK) From GESECRAN
                If OK = 2 [M]RERBPCFLG(NOL)=2 : Endif
            Endif
        Endif
        Affzo [M]WALLQTY(NOL)
    Endif
    
    Return
    
    # --------------------------------------------------------------------------------
    # Initialisation des dates entête commande : date expédition et date de livraison demandée
    # --------------------------------------------------------------------------------
    $INIT_DAT3
    # --> Initialisation de la date d'expédition
    Local Integer WSENS
    If date$ >= [M:SOH0]ORDDAT
        [M:SOH2]SHIDAT = date$
        WSENS=0 :  # (Si indisponibilité on ne peut décaler que vers l'avant)
    Else
        [M:SOH2]SHIDAT = [M:SOH0]ORDDAT
        WSENS=1 :  # (Si indisponibilité on peut décaler vers l'arrière)
    Endif
    # --> Contrôle de la date d'expédition avec les périodes d'indisponibilités du site
    If [M:SOH2]STOFCY<>"" Call CTLUVYFCY([M:SOH2]SHIDAT, [M:SOH2]STOFCY, WSENS) From TRTVENCTL Endif
    
    # --> Calcul de la date de livraison demandée
    Call CALC_DLVDAT([M:SOH2]SHIDAT, WDAYLTI, WBPAADD, WBPCORD, 0, 0, [M:SOH2]DEMDLVDAT) From TRTVENDAT
    # Dde 19843 : Test GADJSHIDAT : Globale cachée = 1 : Pas d'ajustement date d'expédition (nvx param en V150)
    If dim(GADJSHIDAT)>0 & GADJSHIDAT=1 Raz GMESSAGE : Return Endif : # Bug 69110
    # --> Recadrage si possible de la date d'expédition par rapport à la date de livraison demandée calculée
    Local Date WSHIDAT : WSHIDAT=[M:SOH2]SHIDAT
    Call CALC_SHIDAT([M:SOH2]DEMDLVDAT, WDAYLTI, [M:SOH2]STOFCY, 1, 1, [M:SOH0]ORDDAT, WSHIDAT) From TRTVENDAT
    If WSHIDAT<=[M:SOH2]DEMDLVDAT-[M:SOH2]DAYLTI [M:SOH2]SHIDAT=WSHIDAT : Endif
    
    Raz GMESSAGE : # Bug 69110
    Return
    
    #-----------------------------------------------------------------------------------
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #############################################################################
    #    APRES_NBLIG     :    Web                                               #
    #                                                                           #
    #        Décomposée en 2 actions                                            #
    #                                                                           #
    #        1 - Traitement si fin sans validation                              #
    #          - Traitement de validation                                       #
    #          - Suppression d'un gratuit lié à une ligne                       #
    #          - Suppression d'une nomenclature                                 #
    #          - Modification d'une nomenclature si suppression du composé seul #
    #          - Modification d'une nomenclature si modification du composé     #
    #        2 - Création d'un gratuit                                          #
    #                                                                           #
    #############################################################################
    $P1_NBLIG23
    Local Integer  NOL        : NOL=nolign-1
    Local Integer  ORI        : ORI=nolign-1
    Local Integer  NL         : NL=nolign
    Local Integer  FUNCTION   : FUNCTION = 2
    Local Integer  SAVNOL, RET, OK
    
    # Bug 82658 : Recherche tarif si changement de référence article
    # Globale utilisée pour flagger les erreurs suite à la recherche tarif
    If dim(GERRITMREF)>0 Kill GERRITMREF Endif
    
    # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line              "
    If !GIMPORT and !GWEBSERV and dim([M]WSTKTXT)>0
      Raz [M]WSTKTXT : Affzo [M]WSTKTXT
      Raz [M]WALLTXT : Affzo [M]WALLTXT
    Endif
    # /User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO
    
    #---------------------------------------------------------------------------#
    # Fin sans validation : Réhabilitation des totaux et c'est tout             #
    #---------------------------------------------------------------------------#
    #If status = 6 | status = 7 | status = 27 | status = 28  | status >= 1792
    If adxgtb=1 | find(status,6,7)
        Call ADD_TOT(NOL) From SUBSOHB
        mkstat=2
        Return
    Endif
    
    #---------------------------------------------------------------------------#
    # Validation d'une ligne                                                    #
    #---------------------------------------------------------------------------#
    If GMODIF = 2 | GMODIF = 0
        GNETMAR = 1
        Call VERIF_VATCOD(NOL) From SUBSOHB
        Call APRES_LIGNE (NOL,1) From SUBSOHB
        # --> Maj du n.avenant
        If GREV=2:[M:SOH4]LINREVNUM(NOL) = [M:SOH0]REVNUM:Endif
    Endif
    
    # Raz signatures si ajout d'une ligne
    If GREP="M" & [M]CREFLG(NOL)=0 GUPDAPPFLG=2 Endif
    
    # Bug 84030
    #--------------------------------------------------------------------------------------#
    # Suppression d'une ligne de gratuit : Modification de la ligne à l'origine du gratuit #
    #--------------------------------------------------------------------------------------#
    If GMODIF = 1 & GFOCFLG = 3
      Call RAZORIGRA(NOL) From TRTVENBOM
    Endif
    #--------------------------------------------------------------------------------------#
    # Insertion d'une ligne : Maj des lignes de gratuit qui suivent la ligne insérée       #
    # Maj du n° de ligne à l'origine du gratuit car les lignes ont été renumérotées        #
    #--------------------------------------------------------------------------------------#
    If GMODIF=2 & NOL<[M]NBLIG-2
      Call MAJORIGRA(NOL,"SOPLIN") From TRTVENBOM
    Endif
    # Bug 84030
    
    #---------------------------------------------------------------------------#
    # Suppression d'un gratuit lié à une ligne supprimée                        #
    #---------------------------------------------------------------------------#
    #If (status = 65 | status = 68 | status = 83) & GFOCFLG = 2
    If (GMODIF = 1 | GMODIF = 3 | GMODIF = 4) & GFOCFLG = 2
       Call SUPGRA(NOL, FUNCTION, RET) From TRTVENBOM
       # Pb en import en suppression de ligne : affzo remet la variable status qui valait 65 à 1
       If !GIMPORT Affzo [M:SOH4]1-99 Endif
    Endif
    
    #---------------------------------------------------------------------------#
    #        Suppression d'une nomenclature                                     #
    #---------------------------------------------------------------------------#
    OK=1
    If GMODIF=4 & find([M:SOH4]LINTYP(NL), 7,8,9)
        If !GIMPORT Call OUINON(mess(13,191,1),OK) From GESECRAN : Endif
        If OK<>2
    #     ----------------------------------------------------------------------#
    #     Modification d'une nomenclature si suppression du composé seul        #
    #     ----------------------------------------------------------------------#
          Gosub MODNOM From TRTVENBOM
          GMODIF=1
          Affzo [M:SOH4]1-99
          Return
        Endif
    Endif
    If GMODIF=3 | OK=2
      Gosub SUPNOM From TRTVENBOM
      GMODIF=1
      Affzo [M:SOH4]1-99
      Return
    Endif
    
    #---------------------------------#
    # Modification d'une nomenclature #
    #---------------------------------#
    # --> Modification
    OK=1
    If GMODIF = 0
        If !GIMPORT & ([M:SOH4]LINTYP(NOL) = 6  & find([M:SOH4]LINTYP(NL), 7,8,9))
            Call OUINON(mess(14,191,1),OK) From GESECRAN
    #       MSG=Repercussion sur les composants ?
        Endif
        If find([M:SOH4]LINTYP(NOL),2,10) | OK = 2
            SAVNOL=nolign
            Gosub MODNOM From TRTVENBOM
            nolign=SAVNOL
            Affzo [M:SOH4]1-99
        Endif
        Raz GTARFLG : # Bug 62571
        # Sauvegarde nouvelle quantité pour calcul qté nomenclature
        [M]CQTY(NOL) = [M]QTY(NOL)
    Endif
    
    # 106776 -- EDI fields
    Gosub CTL_P1NBLIG From TRTFLDEDI
    
      #--The user create/modify the order                 => the $CREATION/$MODIF will instantiate
      #--Or the user wants to modify the invoice schedule => it's the TRTSAISVIC that will instantiate
      Case GMODIF
        When 0 : #--0 = Modification ligne
                 Gosub P1_NBLIG_DINVCND_UPD From LIBSAL_INVCND_SOH
                 If mkstat>0 or GERR>0 : mkstat=2 : Return : Endif
                 #--Used in LIBSAL_INVCND_SOH_BOM
                 If dim(IS_FROM_MODBOM_SET_SAME_ANSWER)>0
                   Kill IS_FROM_MODBOM_SET_SAME_ANSWER
                 Endif
        When 1 : #--1 = Suppression ligne
                 # Issue 107888 - 2016-09-09 by CPO : US155 Kit & flexible kit scheduled invoices
                 #--Used in LIBSAL_INVCND_SOH_BOM
                 If dim(IS_FROM_MODBOM_SET_SAME_ANSWER)>0
                   Kill IS_FROM_MODBOM_SET_SAME_ANSWER
                 Endif
                 #--Done in AV_NBLIG
        When 2 : #--2 = Nouvelle ligne
                 Gosub P1_NBLIG_DINVCND_INS From LIBSAL_INVCND_SOH
                 If mkstat>0 or GERR>0 : mkstat=2 : Return : Endif
    
      Endcase
    
    Return
    # End issue 107888
    #-----------------------------------------------------------------------------------
    #############################################################################
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    #--nombre d'instructions trop important
    #############################################################################
    $P2_NBLIG23
    Local Integer  ORI        : ORI=nolign-1
    Local Integer  NL         : NL=nolign
    Local Integer  FUNCTION   : FUNCTION=2
    Local Integer  RET
    
    #---------------------------------------------------------------------------#
    # Création d'une ligne                                                      #
    # --> Génération des gratuits                                               #
    #---------------------------------------------------------------------------#
    If GMODIF = 2 & GFOCITMREF <> ""
        If !GIMPORT | (GIMPORT & ((dim(G_FOCFLG)>0 & G_FOCFLG=0) | (dim(G_FOCFLG)<=0)))
        #   Recherche de l'article origine si on est positionné sur un composant
            If !find([M]LINTYP(ORI),1,2,6,10)
                While !find([M]LINTYP(ORI),1,2,6,10) & ORI >= 0
                    ORI-=1
                Wend
            Endif
            # Mode web service : Pb avec les insertions de ligne
            # --> Le gratuit sera généré juste avt la création de la cde dans l'action VERIF
            #     Stockage de la référence du gratuit ds un tableau de globales
            #     Utilisation du chps [M:SOH4]FOCNUMLIG pour stocker, pour l'article à l'origine du gratuit,
            #     l'indice du gratuit ds le tableau de globales
            #     (Utiliser SOPLIN pour faire le lien n'est pas possible car à l'insertion des gratuits, tt est renuméroté)
            If dim(GWEBSERV)=1 & GWEBSERV=1
                GWEBNBGRA+=1
                GWEBFOCITMREF(GWEBNBGRA-1)=GFOCITMREF : GWEBFOCQTY(GWEBNBGRA-1)  =GFOCQTY
                GWEBFOCUOM(GWEBNBGRA-1)   =GFOCUOM    : GWEBFOCMOTIF(GWEBNBGRA-1)=GFOCMOTIF
    
                [M:SOH4]FOCNUMLIG(ORI)=GWEBNBGRA
            Else
                If !GIMPORT & ORI = [M]NBLIG [M]NBLIG +=1 : Endif
                Call CREGRA("G",1, ORI, [M:SOH0]ORDDAT, FUNCTION, NL, RET) From TRTVENBOM
                If !GIMPORT & ORI = NL-1 & ORI = [M]NBLIG - 1 :[M]NBLIG-=1:Endif
                If GIMPORT VALEUR=[M]NBLIG Endif
    
                GPOINT="CPLCREGRA" : Gosub ENTREE From EXEFNC
    
    # Test utilisation CPLCREGRA
    #Local Integer NOCPS : NOCPS=NL-1
    #Raz GBIDI1, GBIDC1
    
    #If [F:ITS]ITMREF <> [M:SOH4]ITMREF(NL-1)
    #    Read [ITM]ITM0=[M:SOH4]ITMREF(NL-1)
    #    If fstat Raz [F:ITS] : Endif
    #Endif
    #If [F:ITS]ITMTYP = 2 [M]LINTYP(NL-1) = 6 :ENDIF
    #If [F:ITS]ITMTYP = 3 [M]LINTYP(NL-1) = 2 :ENDIF
    #Call IMPCRENOM([M:SOH4]ITMREF(NL-1),NL-1,[M:SOH0]ORDDAT,2,GBIDI1,[M:SOH4]SOPLIN(NL),GBIDC1,NOCPS,GBIDI1) From TRTVENBOM
    # Test utilisation CPLCREGRA
    
                Affzo [M:SOH4]5
                If GIMPORT Return Endif : # Bug 72428
            Endif
        Endif
    Endif
    
    # 101874 : V9 : Taxe code control
    # Valuation depends on SOHVALLIG parameter
    #If dim(GVALTTCSOH)>0 & dim(GVALTTC)>0 : GVALTTC=GVALTTCSOH : Endif
    GVALTTC=GSOHVALLIG
    #If (!GIMPORT & !(dim(GWEBSERV)=1 & GWEBSERV=1)) : Call VALTTC ("GESSOH") From TRTVENFACR : Endif
    If (!GIMPORT & !(dim(GWEBSERV)=1 & GWEBSERV=1))
        #---- Paramètres complementaires appel valorisation
        # PARAM_T(0) : Flag contrôle des taxes             (1=Non/2=Oui)
        # PARAM_T(1) : Lecture de la trace par le sous-pro (1=Non/2=Oui)
        # PARAM_T(2) : Flag retour                         (1=KO/2=OK)
        Local    Char     PARAM_T (25) (0..10)
        PARAM_T(0)="1"      : # Pas de contrôle des taxes
        PARAM_T(1)="1"      : # Pas de lecture de la trace
        PARAM_T(2)="0"
        Call VALTTC ("GESSOH", PARAM_T) From TRTVENFACR
    Endif
    # 101874
    
    # Pb en import en suppression de ligne : affzo remet la variable status qui valait 65 à 1
    If !GIMPORT Affzo [M:SOH4]10,15,20 Endif
    
    Return
    #------------------------------------------------------------------------------------------------------
    # 107890 : Scheduled invoices : (LD:21/12/15)
    # -------------------------------------- NBLIG ------------------------
    Subprog B4_NBLIG23
    Local Decimal BASPAG
    # Because of the limit of the number of button, we have to use one button for severals purpose
    If [M]DLVFLG(nolign-1)=2
        # Deliverable Item  : Allocation detail
        If !GWEBSERV
         ## Action VISUDETALL
         Local Char    PARMSK(250)(1..20) , SAVACT(20)
         SAVACT = GACTION : GACTION = "VISUDETALL"
         PARMSK(1) = "SOH4"
         PARMSK(2) = [M:SOH4]DSTOFCY(nolign-1)
         PARMSK(3) = "2"
         PARMSK(4) = [M:SOH0]SOHNUM
         PARMSK(5) = num$([M:SOH4]SOPLIN(nolign-1))
         PARMSK(6) = num$([M:SOH4]SOPLIN(nolign-1))
         Call SAISIE_NUM(BASPAG,PARMSK,"IDETALL","TRTVENFEN","XWIDETALL") From GSAISIE
         GACTION = SAVACT
        Endif
        If mkstat=99 : mkstat = 0 : Elsif mkstat=0 : mkstat = 2 : Endif
    Else
        # Undeliverable Item  : Timetable (Echéancier)
        If !GWEBSERV
         ## Action SAISVIC
         Local Char    PARMSK(250)(1..20) , SAVACT(20)
         SAVACT = GACTION : GACTION = "SAISVIC"
         PARMSK(1) = "SOH4"
         PARMSK(2) = num$(nolign)
         PARMSK(3) = "10"
         PARMSK(4) = [M:SOH0]SOHNUM
         PARMSK(5) = num$([M:SOH4]SOPLIN(nolign-1))
         PARMSK(6) = num$([M:SOH4]SOPLIN(nolign-1))
         PARMSK(7) = "C_SVCRINVCND"
         PARMSK(8) = "GSOHVCRINVCND"
         Call TRAITE_NUM(BASPAG,PARMSK,"ISVIC","TRTSAISVIC","",1,"") From GTRAITE
         GACTION = SAVACT
        Endif
        If mkstat=99 : mkstat = 0 : Elsif mkstat=0 : mkstat = 2 : Endif
    Endif
    
    End
    #------------------------------------------------------------------------------------------------------
    # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line
    $DISPLAY_QTY_STOCKSTATUS23
    
    If dim([M:SOH4]WSTKTXT)<=0 : Return : Endif
    #--We stop if item not managed into stock or if import/webservice context
    If [M:SOH4]STOMGTCOD(NOL)=1 or GIMPORT or GWEBSERV:
      If dim([M:SOH4]WSTKTXT)>0
        Raz [M:SOH4]WSTKTXT
        Raz [M:SOH4]WALLTXT
        If !GIMPORT and !GWEBSERV : Affzo [M:SOH4]WSTKTXT : Affzo [M:SOH4]WALLTXT : Endif
      Endif
      Return
    Endif
    
    Raz [M:SOH4]WALLTXT
    Raz [M:SOH4]WSTKTXT
    
    #--We carry on only if the available stock block is set as displayed for the current sales order transaction
    If GSOHVALLIG<>2 : Return : Endif
    If clalev([F:SLT])=0 : Local File SALTRS [SLT] : Endif
    If [F:SLT]STRTYP<>2 or [F:SLT]STRNUM<>GFLAG
      Read [F:SLT]SLT0=2;GFLAG
      If fstat : Raz [F:SLT] : Endif
    Endif
    If [F:SLT]AVASTOCOD<>2 : Return : Endif
    
    If GREP=""
      Affzo [M:SOH4]WSTKTXT
      Affzo [M:SOH4]WALLTXT
      Return
    Endif
    
    Local Integer WRET
    Local Decimal WSTUDISSTU, WSTUDIS, WSTUDISSTU_STODISALL, WSTUDISSTU_CALFDMA
    Local Char    WNUM
    Local Char    WSTKTXTMESS(255)(0..1) : Raz WSTKTXTMESS
    Local Date    WDATE_FDMA
    Local Integer WALL
    If find(GUSERERBPC, 2,3) WNUM=vireblc(format$("K:15X",[M:SOH0]BPCORD)+format$("K:3X",[M:SOH4]DBPAADD(NOL)), 1) : Endif
    Raz WSTKTXTMESS
    Call STODISALL([M:SOH4]DSTOFCY(NOL),[M:SOH4]ITMREF(NOL),2,[M:SOH4]DALLTYP(NOL),2,2,1,"",WNUM,"",WSTUDISSTU,WRET) From STKALL
    If WRET=1 : Raz [M:SOH4]WSTKTXT : Affzo [M:SOH4]WSTKTXT : Return : Endif
    WSTUDISSTU_STODISALL = WSTUDISSTU
    If WSTUDISSTU > 0
      #--stock is available for entire quantity
      WSTUDIS=WSTUDISSTU*(1/[M:SOH4]SAUSTUCOE(NOL))
      Call QTEARR(WSTUDIS, [M:SOH4]SAU(NOL)) From TRTDIV
      WSTKTXTMESS(0) = [M:SOH4]ITMREF(NOL)-mess(47,191,1)+num$(WSTUDISSTU)-[M:SOH4]STU(NOL)-"/"+mess(380,197,1)+num$(WSTUDIS)-[M:SOH4]SAU(NOL)-mess(4,2972,1)
    Else
      WSTKTXTMESS(0) = [M:SOH4]ITMREF(NOL)-":"-mess(409,197,1)-mess(4,2972,1)
    Endif
    
    If WSTUDISSTU < 0 or WSTUDISSTU < [M:SOH4]QTYSTU(NOL)
      WDAT_FDMA = [0/0/0]
      WALL=2
      Call CAL_FDMA([M:SOH4]DSTOFCY(NOL),[M:SOH4]ITMREF(NOL),2,[M:SOH0]SOHNUM,[M:SOH4]SOPLIN(NOL),[M:SOH4]SOPLIN(NOL),WALL,[M:SOH4]QTYSTU(NOL),WSTUDISSTU,WDAT_FDMA) From STKLIB
      If WDAT_FDMA <> [0/0/0]
        If WSTUDISSTU>0
          WSTUDISSTU_CALFDMA =  WSTUDISSTU
          WSTUDIS=WSTUDISSTU*(1/[M:SOH4]SAUSTUCOE(NOL))
          Call QTEARR(WSTUDIS, [M:SOH4]SAU(NOL)) From TRTDIV
          WSTKTXTMESS(1) = mess(102,191,1)+num$(WSTUDISSTU)-[M:SOH4]STU(NOL)-"/"+mess(380,197,1)+num$(WSTUDIS)-[M:SOH4]SAU(NOL)-mess(38,197,1)-format$(GFMDAT,WDAT_FDMA)
        Endif
      Endif
    Endif
    [M:SOH4]WSTKTXT = WSTKTXTMESS(0)
    If WSTKTXTMESS(1)<>""
      [M:SOH4]WSTKTXT -= "-"-WSTKTXTMESS(1)
    Endif
    Affzo [M:SOH4]WSTKTXT
    Affzo [M:SOH4]WALLTXT
    
    Return
    # /User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO
    #------------------------------------------------------------------------------------------------------
    # User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO : ANALYSIS_FDMA_Display_Quantity_Available_field_on_Sales_Order_line
    $DISPLAY_ALLQTY_STOCKSTATUS23
    If dim([M:SOH4]WALLTXT)<=0 : Return : Endif
    #--We stop if item not managed into stock or if import/webservice context
    If [M:SOH4]STOMGTCOD(NOL)=1 or GIMPORT or GWEBSERV Return Endif
    
    Raz [M:SOH4]WALLTXT
    #--We carry on only if the available stock block is set as displayed for the current sales order transaction
    If GSOHVALLIG<>2 : Return : Endif
    If clalev([F:SLT])=0 : Local File SALTRS [SLT] : Endif
    If [F:SLT]STRTYP<>2 or [F:SLT]STRNUM<>GFLAG
      Read [F:SLT]SLT0=2;GFLAG
      If fstat : Raz [F:SLT] : Endif
    Endif
    If [F:SLT]AVASTOCOD<>2 : Return : Endif
    
    If GREP=""
      Raz [M:SOH4]WSTKTXT
      Affzo [M:SOH4]WSTKTXT
      Affzo [M:SOH4]WALLTXT
      Return
    Endif
    
    Local Integer WRET
    Local Decimal WSTUDISSTU, WSTUDIS, WRALQTYSTU, WXRALQTY,WXRALQTYSTU
    Local Char    WNUM
    Local Char    WSTKTXTMESS(255)(0..1) : Raz WSTKTXTMESS
    # ------------------------------------------------------------------------------- #
    #     Affichage de la quantité restant à allouer et de la quantité disponible     #
    # ------------------------------------------------------------------------------- #
    # Calcul du total alloué : à allouer + préparé + livré/facturé
    WTALLQTY = [M:SOH4]ALLQTY(NOL)+[M:SOH4]SHTQTY(NOL)+[M:SOH4]OPRQTY(NOL)+[M:SOH4]PREQTY(NOL)+[M:SOH4]ODLQTY(NOL)
    If [M:SOH0]SOHCAT = 3
        WTALLQTY += [M:SOH4]INVQTY(NOL)
    Else
        WTALLQTY += [M:SOH4]DLVQTY(NOL)
    Endif
    # Calcul du reste à allouer : Commandé - total alloué
    WRALLQTY = [M:SOH4]QTY(NOL)-WTALLQTY
    
    #--si tout est alloué, pas la peine de continuer, on raz le champ et on sort
    #If WRALLQTY<=0 : Raz [M:SOH4]WSTKTXT : Affzo [M:SOH4]WSTKTXT : Return : Endif
    
    WRALLQTYSTU = WRALLQTY*[M:SOH4]SAUSTUCOE(NOL)
    Call QTEARR(WRALQTYSTU, [M:SOH4]STU(NOL)) From TRTDIV
    
    # Calcul stock disponible
    If find(GUSERERBPC, 2,3) WNUM=vireblc(format$("K:15X",[M:SOH0]BPCORD)+format$("K:3X",[M:SOH4]DBPAADD(NOL)), 1) : Endif
    
    Call STODISALL([M:SOH4]DSTOFCY(NOL),[M:SOH4]ITMREF(NOL),2,[M:SOH4]DALLTYP(NOL),2,2,1,"",WNUM,"",WSTUDISSTU,WRET) From STKALL
    If WRET=1 : Raz [M:SOH4]WSTKTXT : Affzo [M:SOH4]WSTKTXT : Return : Endif
    #•  The stock is availabe for the whole quantity or the qtock is partially available. The following information is displayed:
    #o  'PRODUCT: Remaining quantity to be allocated in stock unit: XXXX UN / In Sales unit: YYYY SAL - Available stock XXXX UN / YYYY SAL' (UN and SAL are the unit stock and sales unit for the current
    # product)
    #• The stock is not available. The following information is displayed:
    #o  'PRODUCT: Remaining quantity to be allocated in stock unit: XXXX UN / In Sales unit: YYYY SAL - Not available'
    If WSTUDISSTU > 0
        WSTUDIS=WSTUDISSTU*(1/[M:SOH4]SAUSTUCOE(NOL))
        Call QTEARR(WSTUDIS, [M:SOH4]SAU(NOL)) From TRTDIV
        WSTKTXTMESS(0) = [M:SOH4]ITMREF(NOL)-":"-mess(46,191,1)-num$(WRALLQTYSTU)-[M:SOH4]STU(NOL)-"/"+mess(380,197,1)+num$(WRALLQTY)-[M:SOH4]SAU(NOL)-"-"-mess(163,197,1)+num$(WSTUDISSTU)-[M:SOH4]STU(NOL)
    & -"/"+mess(380,197,1)
    & +
    & num$(WSTUDIS)-[M:SOH4]SAU(NOL)
    Else
        WSTKTXTMESS(0) = [M:SOH4]ITMREF(NOL)-":"-mess(46,191,1)-num$(WRALLQTYSTU)-[M:SOH4]STU(NOL)-"/"+mess(380,197,1)+num$(WRALLQTY)-[M:SOH4]SAU(NOL)-"-"-mess(409,197,1)
    Endif
    [M:SOH4]WALLTXT = WSTKTXTMESS
    
    Affzo [M:SOH4]WALLTXT
    
    Return
    # /User Story X3-46075 Task X3-48218 - 2017-08-17 by CPO
    #------------------------------------------------------------------------------------------------------
    
    # Issue X3-126595
    ######################################################################################
    $ECCVALMAJMIN_ENABLE23
      # FGR 01/04/2015 : X3SUIVI105605
      If [M:SOH4]TALLQTYSTU(nolign-1) > 0 Then
        mkstat = 2
      Endif
      If find([M:SOH4]LINTYP(nolign-1),3,4,5,11,12,13) Then
        mkstat = 2
      Endif
    Return
    
    # 105605 : CCM - Revision index (LD:18/06/15)
    # -------------------------------------------------- #
    #   Contrôle lié à la contremarque :                 #
    # -------------------------------------------------- #
    $ECCVALMAJMIN_CTM23
    Local Integer WOK : WOK=2
    
    If [M:SOH4]FMINUM(NOL) = "" Return Endif
    
    If [M:SOH4]FMI(NOL)=2
        # Cette ligne a fait l'objet d'une contremarque directe
        GMESSAGE = mess(270,191,1) : mkstat = 2
    Elsif [M:SOH4]FMI(NOL)=3
        # Cette ligne a fait l'objet d'une contremarque réceptionnée
        GMESSAGE = mess(271,191,1)
        If GMODU(6)=2
           Local File PORDER [POH]
           Read [POH]POH0=[M:SOH4]FMINUM(NOL)
           If fstat Raz [F:POH] Endif
           # La commande d'achat est imprimée
           If [F:POH]PRNFLG=2 GMESSAGE= GMESSAGE+"."-mess(272,191,1) Endif
        Endif
        Call AVERTIR(GMESSAGE,WOK) From GESECRAN
        Raz GMESSAGE
        If WOK=1 mkstat=2 Endif
    Elsif [M:SOH4]FMI(NOL)=5
        # Cette ligne a fait l'objet d'une ordre de fabrication
        GMESSAGE = mess(269,191,1) : mkstat = 2
    Endif
    
    Return
    # 105605 : CCM - Revision index (LD:18/06/15)
    ######################################################################################
    # pour la navigation vers le plan d'affectation
    $MEM_VCR23
    If find(GREP,"C","D")
        If dim(GVCR)=1 : # If dim(GVCR) : # GH 24/10/12 bug 85427
            Raz GVCR, GLIN, GSEQ
        Endif
        Return
    Endif
    If dim(GVCR) < 0
        Global Char    GVCR
        Global Integer GLIN
        Global Integer GSEQ
    Endif
    
    GVCR = [M:SOH0]SOHNUM
    GLIN = [M:SOH4]SOPLIN(nolign-1)
    GSEQ = [M:SOH4]SOPLIN(nolign-1)
    Return
    
    # --------------------------------------------------------------------------------
    # Affichage des champs suite à la recherche tarif
    # --------------------------------------------------------------------------------
    $AFF_RECH_TAR23
    
    If dim(GWEBSERV)=1 & GWEBSERV=1 Return Endif
    
    Affzo [M:SOH4]GROPRI(NOL)
    If dim([M:SOH4]DISCRGVAL1(NOL))>0 Affzo [M:SOH4]DISCRGVAL1(NOL) Endif
    If dim([M:SOH4]DISCRGVAL2(NOL))>0 Affzo [M:SOH4]DISCRGVAL2(NOL) Endif
    If dim([M:SOH4]DISCRGVAL3(NOL))>0 Affzo [M:SOH4]DISCRGVAL3(NOL) Endif
    If dim([M:SOH4]DISCRGVAL4(NOL))>0 Affzo [M:SOH4]DISCRGVAL4(NOL) Endif
    If dim([M:SOH4]DISCRGVAL5(NOL))>0 Affzo [M:SOH4]DISCRGVAL5(NOL) Endif
    If dim([M:SOH4]DISCRGVAL6(NOL))>0 Affzo [M:SOH4]DISCRGVAL6(NOL) Endif
    If dim([M:SOH4]DISCRGVAL7(NOL))>0 Affzo [M:SOH4]DISCRGVAL7(NOL) Endif
    If dim([M:SOH4]DISCRGVAL8(NOL))>0 Affzo [M:SOH4]DISCRGVAL8(NOL) Endif
    If dim([M:SOH4]DISCRGVAL9(NOL))>0 Affzo [M:SOH4]DISCRGVAL9(NOL) Endif
    Affzo [M:SOH4]REPCOE(NOL)
    Affzo [M:SOH4]NETPRI(NOL)
    
    Return
    # End issue X3-126595
    
    # 139565 : Milestone billing / X3-185425 - 2020-03-19 by LD
    # Pour une ligne de commande avec echeancier, controle qu'un code PJT est compatible avec les jalons liés aux lignes d'échéancier
    # Ctrl ssi code activité "PJM" actif
    # For a line with schedule invoices, control that a PJT code is compatible with the milestones linked to the schedule invoices
    # Control only if "PJM" code activity active
    $CTL_PJT_COMPATIBILITY23
    Local Integer WOK : WOK=2
    
    If !func ASYRFNC.ACTIV("PJM") Return Endif
    Local Integer IRET
    
    # Racine nouveau PJT
    # Root new PJT
    Local Char WNEWPROJECT(GLONPIM)
    Local Char WNEWBUDGET(GLONPBU)
    Local Char WNEWTASK(GLONTAC)
    IRET = func PIMPL_CSTD_PROGS.PJM_KEY_SPLIT(GACTX, WNEWPJT, WNEWPROJECT, WNEWBUDGET, WNEWTASK)
    # L'ancien code PJT était vide et il a été renseigné
    # The old PJT code was empty and it has been fed
    # Issue X3-110981/189977 - 2020-06-10 by MUARN : strict control of PJT
    #If WOLDPJT=""
    #    Call AVERTIR (mess (289, 191,1)-WNEWPROJECT, WOK) From GESECRAN
    #    If WOK=1 WRET = [V]CST_AERROR Endif
    #    Return
    #Endif
    
    # Le code PJT a été modifié : A-t-il la même racine ?
    # The PJT code has been modified : Does it have the same root ?
    # Racine ancien  PJT
    # Root old PJT
    Local Char WOLDPROJECT(GLONPIM)
    Local Char WOLDBUDGET(GLONPBU)
    Local Char WOLDTASK(GLONTAC)
    IRET = func PIMPL_CSTD_PROGS.PJM_KEY_SPLIT(GACTX, WOLDPJT, WOLDPROJECT, WOLDBUDGET, WOLDTASK)
    If WOLDPROJECT=WNEWPROJECT Return Endif
    
    # Issue X3-110981/189977 - 2020-06-10 by MUARN : strict control of PJT
    # Le nouveau PJT n'a pas la même racine
    # The new PJT does not have the same root
    #Call AVERTIR (mess (289, 191,1)-WNEWPROJECT, WOK) From GESECRAN
    #If WOK=1 WRET = [V]CST_AERROR Endif
    
    # Issue X3-110981/189977 - 2020-06-10 by MUARN : strict control of PJT
    Raz GERR
    Gosub AM_DPJT_PJTMST_CTRL From LIBSAL_INVCND_SOH
    If GERR=1 : WRET = [V]CST_AERROR : mkstat=2 : Endif
    # End issue X3-110981/189977
    
    Return
    
    
    #########################################################################
    #                                                                       #
    # Etiquettes appelées par SUBSOH                                        #
    #                                                                       #
    #  $TEST_INS      : Test d'insertion d'une ligne de commande            #
    #  $TEST_ANU      : Test de suppression d'une ligne de commande         #
    #  $TEST_MOD      : Test de modification d'une ligne de commande        #
    #  $CTR_BPCOST    : Contrôle client bloqué                              #
    #  $CTR_STOFCY    : Contrôle modification site expédition entête        #
    #  $CTR_QTY       : Contrôle qtée cdée avec qtée mini et maxi           #
    #  $CTR_CTM       : Contrôle lié à la contremarque                      #
    #  $CTR_BETFCY    : Contrôle lié à l'intersociete                       #
    #  $CTR_LOC       : Contrôle emplacement client pour les cdes prêts     #
    #  $CTR_LNDBETFCY : Contrôle lié à l'intersociete                       #
    #  $VERIF_LIGNE   : Vérification des lignes (recherche interdit)        #
    #  $RECALC_LIGNE  : Traitement des lignes                               #
    #  $TRT_RPLITM    : Traitement de l'article de remplacement             #
    #                                                                       #
    # Etiquettes appelées par SUBSOHA                                       #
    #                                                                       #
    #  $RECALC_GROUPE : Recalcul des lignes suite à tarif groupé            #
    #  $TR_ALLOC      : Bouton allocation de la commande                    #
    #  $MAJSTASOH     : Recalcul des états de la commande                   #
    #  $MAJADRESSE    : Mise à jour de l'adresse                            #
    #  $CHARGE_ADRBPC : Chargement de l'adresse commande                    #
    #  $CHARGE_ADRBPI : Chargement de l'adresse facture                     #
    #  $CHARGE_ADRBPD : Chargement de l'adresse livraison                   #
    #  $GEN_COM       : Génération commande depuis les devis                #
    #                                                                       #
    # Traitements communs et Etiquettes communes                            #
    #                                                                       #
    #  Subprog LECT_FIC(NLIG)                                               #
    #       Lecture de tous les fichiers utiles à une ligne                 #
    #  Subprog INIT_SOH(NLIG, AFF)                                          #
    #       Init. des zones détails venant de l'entête                      #
    #  Subprog INIT_ITM(NLIG, ITMREF)                                       #
    #       Init. des zones détails venant de l'article                     #
    #  Subprog AVANT_LIGNE(NLIG, AFF)                                       #
    #       Traitement d'avant lignes                                       #
    #  Subprog VERIF_VATCOD(NLIG)                                           #
    #       Vérification des codes taxes                                    #
    #  Subprog APRES_LIGNE(NLIG, AFF)                                       #
    #       Traitement d'apres lignes                                       #
    #  Subprog ADD_TOT(NLIG, AFF)                                           #
    #       Calcul des montants total de la commande en +                   #
    #  Subprog SUB_TOT(NLIG, AFF)                                           #
    #       Calcul des montants total de la commande en -                   #
    #  Subprog SUP_LIG(NLIG, WRET)                                          #
    #       Suppression d'une ligne dans le tableau                         #
    #                                                                       #
    #  $TRT_CLESOQ    : Traitement de solde d'une ligne de commande         #
    #  $CALC_SOQSTA   : Recalcul de l'état de la ligne de commande          #
    #  $CALC_DLR      : Calcul mnts à livrer HT et TTC d'une ligne commnande#
    #  $CALC_ORD      : Calcul mnts ht et ttc d'une ligne commande          #
    #                                                                       #
    #########################################################################
    # Issue 110640 - 20150831 by LD : CCM et article de remplacement
    # Issue 110706 - 20151012 by LD : Picking devis et composé nomenclature
    # Issue 106149 - 20160316 by LD : Entry point ADD_TOT and SUB_TOT
    # Issue 116275 - 20160615 by LD : Compteur commande de vente depuis saisi devis
    # Issue 116789 - 20170106 by LD : Entry point CALC_ORD
    # Issue X3-66385 - 20180221 by LD : Sales order: Default package by shipment site
    # Issue X3-59918 - 20180427 by LD : Grouped pricing doesn't work in an order created from a quote
    # Issue X3-243729 - 2021-05-31 SDEM --> deletion SO lines contracts with status create
    
    #-------------------------------#
    # Test d'insertion de ligne     #
    #-------------------------------#
    $TEST_INS
    If GREP="D"
    # --> Ctrl particulier en dupli. pour l'euro : vérifier que ce n'est pas une devise "in"
        Call CONTDEV([M:SOH1]CUR,[M:SOH0]ORDDAT) From TRTDEV
        If mkstat=2 Return Endif
    Endif
    # Issue X3-142391 - 2020-04-08 by SR : Tests web service mode in order to not update mkstat and write the error
    #If [M:SOH2]STOFCY="" GMESSAGE = mess(174,192,1) : mkstat=2 : Return : Endif
    If [M:SOH2]STOFCY="" GMESSAGE = mess(174,192,1)
       If !(dim(GWEBSERV)=1 & GWEBSERV=1) mkstat=2
       Else
        Call ERREUR(GMESSAGE) From GESECRAN
       Endif
       Return
    Endif
    # Si transformation d'un devis avec prospect il est possible que la condition de paiement soit à ""
    # Issue X3-142391 - 2020-04-08 by SR : Tests web service mode in order to not update mkstat and write the error
    #If [M:SOH3]PTE=""    GMESSAGE = mess(264,192,1) : mkstat=2 : Return : Endif
    If [M:SOH3]PTE=""    GMESSAGE = mess(264,192,1)
       If !(dim(GWEBSERV)=1 & GWEBSERV=1) mkstat=2
       Else
        Call ERREUR(GMESSAGE) From GESECRAN
       Endif
       Return
    Endif
    # Issue X3-186206 - 2020-05-14 by MUARN : as picking
    #If dim([M:SOH4]ITMREF) < [M:SOH4]NBLIG + 2
    If [M:SOH4]NBLIG+1 >= dim([M:SOH4]ITMREF)-1
       # Issue X3-142391 - 2020-04-08 by SR : Tests web service mode in order to not update mkstat and write the error
       #GMESSAGE = mess(122,199,1): mkstat=2: Return
       GMESSAGE = mess(122,199,1)
       If !(dim(GWEBSERV)=1 & GWEBSERV=1) mkstat=2
       Else
         Call ERREUR(GMESSAGE) From GESECRAN
       Endif
       Return
    Endif
    # --> pas d'insertion si composant kit/sous-traité
    If ([M:SOH4]LINTYP(NOL)>2 & [M:SOH4]LINTYP(NOL)<=5) | ([M:SOH4]LINTYP(NOL)>10 & [M:SOH4]LINTYP(NOL)<=13)
       If [M:SOH4]CREFLG(NOL) <> 0 GMESSAGE = mess(97,192,1) Endif
       If !(dim(GWEBSERV)=1 & GWEBSERV=1) mkstat=2
       # Issue X3-142391 - 2020-04-08 by SR : Write the error in web service mode
       Else
         If GMESSAGE <> "" : Call ERREUR(GMESSAGE) From GESECRAN : Endif
       Endif
       Return
    Endif
    If [M:SOH4]LINTYP(NOL) > 6 & [M:SOH4]LINTYP(NOL) <=9
       If [M:SOH4]CREFLG(NOL) <> 0 GMESSAGE = mess(97,192,1) Endif
       # Issue X3-142391 - 2020-04-08 by SR : Tests web service mode in order to not update mkstat and write the error
       #If !(dim(GWEBSERV)=1 & GWEBSERV=1) mkstat=2 Endif
       If !(dim(GWEBSERV)=1 & GWEBSERV=1) mkstat=2
       Else
         If GMESSAGE <> "" : Call ERREUR(GMESSAGE) From GESECRAN : Endif
       Endif
       Return
    Endif
    # --> pas d'insertion si la commande a été générée sur un autre site
    # Issue X3-142391 - 2020-04-08 by SR : Tests web service mode in order to not update mkstat and write the error
    If [M:SOH0]ORIFCY<>"" & [M:SOH0]ORIFCY<>[M:SOH0]SALFCY
        #GMESSAGE = mess(122,199,1)-":"-mess(862,196,1) : mkstat=2 : Return
        GMESSAGE = mess(122,199,1)-":"-mess(862,196,1)
        If !(dim(GWEBSERV)=1 & GWEBSERV=1) mkstat=2
        Else
          Call ERREUR(GMESSAGE) From GESECRAN
        Endif
        Return
    Endif
    # --> pas d'insertion si gratuit
    # Issue X3-142391 - 2020-04-08 by SR : Tests web service mode in order to not update mkstat and write the error
    If [M:SOH4]FOCFLG(NOL) = 3
       #GMESSAGE = mess(98,192,1) : mkstat = 2
       GMESSAGE = mess(98,192,1)
       If !(dim(GWEBSERV)=1 & GWEBSERV=1) mkstat=2
       Else
         Call ERREUR(GMESSAGE) From GESECRAN
       Endif
    Endif
    Return
    
    #------------------------------#
    # Test de suppression de ligne #
    #------------------------------#
    $TEST_ANU
    Local Integer OK
    Local Integer ICANDELCON
    
    # --> pas de suppression si ligne soldee
    If [M:SOH4]SOQSTA(NOL) = 3
       GMESSAGE = mess(18,192,1) : mkstat=2 : Return
    Endif
    # --> pour supprimer cette ligne, il faut la désélectionner de la liste 'sélection devis'
    If [M:SOH4]DETSQHNUM(NOL)<>"" & [M:SOH4]CREFLG(NOL)=0
       GMESSAGE=mess(210,192,1) : mkstat=2 : Return
    Endif
    # --> Pas de suppression si ligne préparée ou livrée ou facturée (partiellement ou totalement)
    If [M:SOH4]TALLQTY(NOL)-[M:SOH4]ALLQTY(NOL)+[M:SOH4]LPRQTY(NOL) > 0
       GMESSAGE = mess(313,192,1) : mkstat = 2 : Return
    Endif
    # --> Si ligne allouee, dde de confirmation : Si oui, la ligne et les allocations seront supprimées
    If sum([M:SOH4]ALLQTYSTU(NOL), [M:SOH4]SHTQTYSTU(NOL)) <> 0
        OK=2 : Call AVERTIR(mess(119,191,1)-":"-mess(205,100,1), OK) From GESECRAN
        If OK=1 mkstat=2 : Return : Endif
    Endif
    # --> pas de suppression sur un composant kit/sous-traité
    If ([M:SOH4]LINTYP(NOL)>2 & [M:SOH4]LINTYP(NOL)<6) | ([M:SOH4]LINTYP(NOL)>10 & [M:SOH4]LINTYP(NOL)<14)
       GMESSAGE = mess(26,192,1) : mkstat = 2 : Return
    Endif
    # --> Pas de Suppression multiple s'il y a des composants de nomenclatures
    If status = 83 & find([M:SOH4]LINTYP(NOL),7,8,9)
       GMESSAGE = mess(172,192,1) : mkstat=2 : Return
    Endif
    # --> Pas de Suppression multiple s'il y a des gratuits
    If status = 83 & [M:SOH4]FOCFLG(NOL) = 3
       GMESSAGE = mess(172,192,1) : mkstat=2 : Return
    Endif
    # --> pas de suppression si ligne en ctm et contremarque générée
    If [M:SOH4]FMINUM(NOL) <> ""
        Local Integer WOK : WOK=1
        Call AVERTIR (mess(52,191,1), WOK) From GESECRAN
        If WOK=1 mkstat=2 : Return : Endif
    Endif
    # --> pas de suppression si la commande a été générée sur un autre site
    If [M:SOH0]ORIFCY<>"" & [M:SOH0]ORIFCY<>[M:SOH0]SALFCY
        GMESSAGE = mess(54,123,1)-":"-mess(862,196,1) : mkstat=2 : Return
    Endif
    
    # 107890 : Scheduled invoices : (LD:21/12/15)
    # If line tied to a schedule invoice, it is not deletable if the schedule is invoiced
    If [M:SOH4]DINVCND(NOL)<>"" & [M:SOH4]INVQTY(NOL)<>0
        GMESSAGE = mess(54,123,1)-":"-mess(436,192,1) : mkstat=2 : Return
    Endif
    # 107890 : Scheduled invoices : (LD:21/12/15)
    
    # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan  - 2020-07-16 by LD
    # If the line is associated to a billing plan, it is not deletable
    If dim([M:SOH4]PRGBILNUM)> 0 & [M:SOH4]PRGBILNUM(NOL)<>""
        GMESSAGE = mess(54,123,1)-":"-func AFNC.MES1(mess(291,191,1),"")-[M:SOH4]PRGBILNUM(NOL) : mkstat=2 : Return
    Endif
    # 200515 : Progress billing / X3-199457 : Control on sales order lines associated to a billing plan  - 2020-07-16 by LD
    
    # Issue X3-243729 by SDEM
    If dim([V]G_AC_PREPM)>0 or [V]G_AC_PREPM & [V]GPREFUN = 2
      If find([M:SOH4]PREPSTA([L]NOL),3,4)<>0
        GMESSAGE = mess(606,192,1) : mkstat = 2 : Return
      Elsif [M:SOH4]PREPSTA([L]NOL) = 2
        [V]GDEL_ARR(maxtab([V]GDEL_ARR)+1) = [M:SOH4]PCNTNUM([L]NOL)
      Endif
    Endif
    # Issue X3-243729 End
    #######################################################################
    # FGR 14/02/2014 : X3SUIVI96419 (début)
    ##Modif CRM 31/10/2000
    ##Suppression du contrat de service associé à une ligne de commande.
    #If [M:SOH4]CONNUM(NOL) <> ""
    #    If [M:SOH4]NBLIG > 1
    #        #Souhaitez-vous supprimer le ou les contrats de services associés à cette ligne de commande ?
    #        Call OUINON(mess(337, 196, 2), ICANDELCON) From GESECRAN
    #        If ICANDELCON = 2
    #            Call DELSOHCON(2, [M:SOH0]SOHNUM, [M:SOH4]SOPLIN(NOL)) From SUBCONB1
    #        Endif
    #    Endif
    #Endif
    # FGR 14/02/2014 : X3SUIVI96419 (fin)
    Return
    
    #-------------------------------#
    # Test de modification de ligne #
    #-------------------------------#
    $TEST_MOD
      NOL=nolign-1
      # --> pas de modification si ligne soldee
      #If [M:SOH4]SOQSTA(NOL) = 3 mkstat=2 : GMESSAGE = mess(18,192,1) Endif
      If zoncou="NBLIG" #--CPO 103367 Eviter affichage erreur 2x si tab sur ligne préc
        # FGR 04/01/2016 : X3SUIVI112575 (début)
        #If [M:SOH4]SOQSTA(NOL) = 3 mkstat=2 : GMESSAGE = mess(18,192,1) Endif
        If [M:SOH4]SOQSTA(NOL) = 3 Then
          If !(dim(GWEBSERV)=1 & GWEBSERV=1) Then mkstat = 2 Endif
          GMESSAGE = mess(18,192,1)
        Endif
        # FGR 04/01/2016 : X3SUIVI112575 (fin)
      Endif
      # --> pas de modification sur un composant kit
      If ([M:SOH4]LINTYP(NOL)>2 & [M:SOH4]LINTYP(NOL)<6)
        # --> Test pour ne pas avoir le message en creation !
        If [M:SOH4]CREFLG(NOL) <> 0 GMESSAGE = mess(26,192,1) Endif
        If !(dim(GWEBSERV)=1 & GWEBSERV=1) mkstat=2 Endif
      Endif
      # FGR 14/02/2014 : X3SUIVI96419 (début)
      If [M:SOH4]SOQSTA(NOL) <> 3 and [M:SOH4]CONNUM(NOL) <> "" Then
        # Ligne contrat désoldée pour être supprimée uniquement
        #mkstat = 2                                               # FGR 04/01/2016 : X3SUIVI112575
        If !(dim(GWEBSERV)=1 & GWEBSERV=1) Then mkstat = 2 Endif  # FGR 04/01/2016 : X3SUIVI112575
        GMESSAGE = mess(392,192,1)
      Endif
      # FGR 14/02/2014 : X3SUIVI96419 (fin)
      Gosub LOAD_GUPD_SO_LINE From SUBSOHA1 #Issue X3-243729 by SDEM
    
    Return
    
    #------------------------------------------------------#
    # Contrôles modification site expédition entête        #
    #------------------------------------------------------#
    $CTR_STOFCY
    Local Char    WFCY : WFCY=VALEUR
    Local Integer OK   : OK=1
    
    # --> Site non modifiable si il y a des allocations
    If sum([M]ALLQTY,[M]SHTQTY) <> 0
        If [M]DME = 3
            mkstat = 2 : GMESSAGE= mess(90,192,1) : Return
        Else
            Call AVERTIR(mess(119,191,1)-":\"-mess(205,100,1),OK) From GESECRAN
            If OK=1 mkstat=2 : Return : Endif
        Endif
    Endif
    # --> Site non modifiable si il y a des préparations
    If sum([M]LPRQTY,[M]OPRQTY,[M]PREQTY) <> 0
        If [M]DME = 3
            mkstat = 2 : GMESSAGE= mess(9,123,1)-":\"-mess(310,192,1) : Return
        Else
            OK=1:Call AVERTIR(mess(310,192,1)-":\"-mess(205,100,1),OK) From GESECRAN
            If OK=1 mkstat=2 : Return : Endif
        Endif
    Endif
    # 107888 : Scheduled invoices : (LD:19/05/16)
    #If [M]SOHCAT <> 3 & sum([M]ODLQTY,[M]DLVQTY) <> 0
    #    If [M]DME = 3
    #        mkstat = 2 : GMESSAGE= mess(9,123,1)-":\"-mess(120,191,1) : Return
    #    Else
    #        OK=1:Call AVERTIR(mess(120,191,1)-":\"-mess(205,100,1),OK) From GESECRAN
    #        If OK=1 mkstat=2 : Return : Endif
    #    Endif
    #Endif
    # --> Commande normale/prêt
    # --> Site non modifiable s'il y a des livraisons (pour les articles livrables) ou des factures (pour les articles non livrables)
    If [M]SOHCAT <> 3 & sum([M]ODLQTY,[M]DLVQTY,[M]INVQTY) <> 0
        If [M]DME = 3
            mkstat = 2 : GMESSAGE= mess(9,123,1)-":\"-mess(275,191,1) : Return
        Else
            OK=1:Call AVERTIR(mess(275,191,1)-":\"-mess(205,100,1),OK) From GESECRAN
            If OK=1 mkstat=2 : Return : Endif
        Endif
    Endif
    # 107888 : Scheduled invoices : (LD:19/05/16)
    
    # --> Commande à facturation directe
    # --> Site non modifiable si il y a des factures
    If [M]SOHCAT = 3 & sum([M]ODLQTY, [M]INVQTY) <> 0
        If [M]DME = 3
            mkstat = 2 : GMESSAGE= mess(9,123,1)-":\"-mess(58,117,1) : Return
        Else
            OK=1:Call AVERTIR(mess(58,117,1)-":\"-mess(205,100,1),OK) From GESECRAN
            If OK=1 mkstat=2 : Return : Endif
        Endif
    Endif
    
    # --> Site non modifiable si une contremarque a été générée
    If sum([M]FMINUM) <> ""
         mkstat = 2 : GMESSAGE= mess(9,123,1)-":\"-mess(53,191,1) : Return
    Endif
    # --> Site non modifiable si un article-site est inexistant
    Gosub VERIF_LIGNE_ITF From TRTVENCDE
    If OK=0 GMESSAGE =GMESSAGE-mess(25,192,1)-WFCY-"\"-mess(9,123,1) : mkstat=2 : Return : Endif
    Return
    
    
    #----------------------------------------#
    # Contrôle qte avec qte mini et qte maxi #
    #----------------------------------------#
    $CTR_QTY
    Local    Decimal QTY_UV
    
    # --> Calcul de la qtée cdée en UV
    If [M:SOH4]SAU(NOL) <> [F:ITM]SAU
         Call SCAL_QUV(VALEUR, [M:SOH4]ITMREF(NOL),[M]BPCORD,[M:SOH4]SAU(NOL),[F:ITM]SAU, QTY_UV, GBIDD1) From TRTVENQTE
    Else
         QTY_UV = VALEUR
    Endif
    # --> Controle qte cdee >= a la qte minimale
    If QTY_UV < [F:ITS]MINQTY & [F:ITS]MINQTY > 0
        GMESSAGE = sum(mess(12,192,1), format$("N:"+GFMTQTY, num$([F:ITS]MINQTY)), " ", [F:ITM]SAU)
        If GDACLOK = 1 mkstat=2 : Return
        Else           GERR=2 : Endif
    Endif
    # --> Controle qte cdee <= a la qte maximale
    If QTY_UV > [F:ITS]MAXQTY & [F:ITS]MAXQTY > 0
        If GERR=2 GMESSAGE += "\" Endif
        GMESSAGE += sum(mess(13,192,1), format$("N:"+GFMTQTY, num$([F:ITS]MAXQTY)), " ", [F:ITM]SAU)
        If GDACLOK = 1 mkstat=2
        Else           GERR=2 : Endif
    Endif
    Return
    
    $CTR_CTM
    Local Integer OK : OK=2
    # -------------------------------------------------- #
    #   Contrôle lié à la contremarque :                 #
    #   La ligne a fait l'objet d'une contremarque       #
    # -------------------------------------------------- #
    
    #If find([M:SOH4]FMI(NOL),2,3,5) & [M:SOH4]FMINUM(NOL) <> ""  : # 88016
    If find([M:SOH4]FMI(NOL),3,5) & [M:SOH4]FMINUM(NOL) <> ""     : # 88016
    # 88016 : # Si Ctm réceptionnée, Ctm production : Msg avertissement
        # 105605 : CCM - Revision index (LD:18/06/15)
        #Call AVERTIR(mess(52,191,1),OK) From GESECRAN
        If [M:SOH4]FMI(NOL)=3
            # Cette ligne a fait l'objet d'une contremarque réceptionnée
            Call AVERTIR(mess(271,191,1),OK) From GESECRAN
        Else
            # Cette ligne a fait l'objet d'un ordre de fabrication
            Call AVERTIR(mess(269,191,1),OK) From GESECRAN
        Endif
        # 105605 : CCM - Revision index (LD:18/06/15)
    # 88016 : # Si Ctm directe : Ctrl bloquant
    Elsif [M:SOH4]FMI(NOL)=2 & [M:SOH4]FMINUM(NOL) <> ""
        GMESSAGE = mess(52,191,1): mkstat = 2
    # 88016
    Endif
    
    Return
    
    $CTR_BETFCY
    Local Integer OK : OK=2
    # ----------------------------------------------------------- #
    #   Contrôle lié à l'inter-société :                          #
    #   La commande a été générée à partir d'une commande d'achat #
    # ----------------------------------------------------------- #
    If [M:SOH0]ORIFCY<>"" & [M:SOH0]ORIFCY<>[M:SOH0]SALFCY
        Call AVERTIR(mess(148,191,1),OK) From GESECRAN
        If OK=1 mkstat=2 Endif
    Endif
    Return
    
    #----------------------------------------#
    # Contrôles liés à l'inter-société       #
    #----------------------------------------#
    $CTR_LNDBETFCY
    # Bug 56725 : Interdire la saisie d'une commande inter-site de prêt
    # (désactivation du ctrl possible par spécifique si GLNDBETFCY est déclaré et =1)
    If dim(GLNDBETFCY)>0 & GLNDBETFCY=1 Return Endif
    If WLND=2 & WBETFCY=2 GMESSAGE=mess(291,192,1) : mkstat=2 : Return : Endif
    
    Return
    
    $CTR_LOC
    Local Integer OK
    # -------------------------------------------------- #
    #   Si commande de prêt                              #
    #   --> Contrôle de l'emplacement client             #
    # -------------------------------------------------- #
    If [M:SOH0]SOHCAT = 2 & GMODU(7)=2
       If !clalev ([F:STC]) Local File STOLOC [STC] Endif
       Read [STC]STC0=WSTOFCY;[F:BPD]BPCLOC
       If fstat
          GMESSAGE = mess(117,192,1)
          mkstat = 2
    # <MG> 31/01/01
       Elsif [F:STC]LOCCAT <> 3
          GMESSAGE = mess(118,192,1)
          mkstat = 2
       Endif
       Close Local File [STC]
    Endif
    Return
    
    # 79705 : SAT in SPRICLINK : Step 2
    #-------------------------------------------------------------------------------------#
    # Etiquette de recherche des interdits pour une commande                              #
    #-------------------------------------------------------------------------------------#
    # Déclenchée suite à modification de l'addresse de liv de l'entête                    #
    # Trigered   by    the invoing term modification
    # Avec répercussion sur les lignes détails                                            #
    #                                                                                     #
    # Appelée par l'action de répercussion TRTMAJDET avant lancement de la répercussion   #
    # TRTMAJDET est appelée en am_modif BPAADD                                            #
    # (Si interdit alors Refus de la repercussion si SDACLOK=1,Avertissement si SDACLOK=2)#
    #                                                                                     #
    # TRTMAJDET is  called  in am_modif INVCND                                            #
    #                                                                                     #
    #      FFLGMOD = 1            : Modification de la zone détail                        #
    #      FFLGMOD = 3            : Comparaison et modification de la zone détail         #
    #      FFLGMOD = "",2         : Sur BPAADD, Répercution forcée car GLINREP=1          #
    #-------------------------------------------------------------------------------------#
    $VERIF_LIGNES
    Local Char     NOMD, NOME
    Local Integer  NLIG
    Local Char     WREP(GLONREP), WBPAADD (GLONBPD)
    Local Integer  WOK
    
    Local Integer  SAVNOLIGN : SAVNOLIGN=nolign
    
    If [M]ORDSTA = 2 Return : Endif
    
    Raz NLIG
    While NLIG < [M:SOH4]NBLIG
        If [M:SOH4]SOQSTA(NLIG) <>  3
    #   Traitement uniquement si la ligne n'est pas soldée
            If FFLGMOD <> ""
                NOME = WZONCOU
                If NOME <> "REP"
                   NOMD = sum ("D", NOME)
                Else
                   WIND  = indice
                   NOMD = sum(NOME, num$(WIND+1))
                   NOME = sum(NOME, "(", num$(WIND), ")")
                Endif
                Gosub VERIF_ZON
            Endif
        Endif
        NLIG+=1
    Wend
    # X3-200515 : Progress billing / X3-220424 : Blocking control on invoicing term update - 2020-11-03 by LD
    #If GERR=1 mkstat=2 Endif
    # X3-200515 : Progress billing / X3-220424 : Blocking control on invoicing term update - 2020-11-03 by LD
    
    nolign=SAVNOLIGN
    
    Return
    
    #-------------------------------------#
    # Vérification de la zone détail      #
    #-------------------------------------#
    $VERIF_ZON
    
    #--- Comparaison zone entête/zone détail
    If FFLGMOD="3"
      If evalue("dim([M:SOH4]"+NOMD+"(NLIG))") >0 & evalue("dim([M]"+NOME+")") >0
         If evalue("[M:SOH4]"+NOMD+"(NLIG)") <> evalue("[M]"+NOME) : Return : Endif
      Endif
    Endif
    
    # --- Modification de l'adresse de livraison
    If NOME = "BPAADD"
        # Recherche interdit suite modification de l'adresse
        If dim([M:SOH4]REP1(NLIG)) > 0
          WREP=[M:SOH4]REP1(NLIG)
          If GLINREP=2
              # Alimentation des représentants s'ils n'ont pas été alimentés par le client commande
              If [F:BPC]BPCNUM <> [M:SOH0]BPCORD
                  Read [BPC]BPC0 = [M:SOH0]BPCORD
                  If fstat <> 0 Raz [F:BPC] : Endif
              Endif
              # Alimentation du 1er représentant
              If [F:BPC]REP(0) = ""
                  WREP= [F:BPD]REP(0)
              Endif
          Endif
        Endif
        WBPAADD=[M:SOH4]DBPAADD(NLIG)
        [M:SOH4]DBPAADD(NLIG)=VALEUR  : # Il faut affecter le champ pour que la recherche interdit ait la bonne valeur
        nolign=NLIG+1                 : # La recherche interdit utilise nolign
        Call RECH_INTERDIT ([M:SOH4]ITMREF(NLIG), VALEUR, WREP, 2) From TRTVENTAR
        If mkstat=2
          GERR=1 : GMESSAGE=[M:SOH4]ITMREF(NLIG)-":"-GMESSAGE
          If GTRACE <> "" Call ECR_TRACE(GMESSAGE, 0) From GESECRAN Endif
          mkstat=0 : Raz GMESSAGE
        Endif
        [M:SOH4]DBPAADD(NLIG)=WBPAADD : # Recherche terminée : Réaffectation de la valeur
    # X3-200515 : Progress billing / X3-220424 : Blocking control on invoicing term update - 2020-11-03 by LD
    # Invoicing term
    Elsif NOME = "INVCND"
        # X3-200515 : Progress billing / X3-222013 : Progress billing - general test - 2020-12-15 by LD
        # we can't modify the invoicing term on a line with scheduled invoices linked with a milestone
        If find(GREP,"C","D")=0 & func TRTVENDIV.VERF_SVICD_PJTMST([M:SOH0]SOHNUM, [M:SOH4]SOPLIN(NLIG), [M:SOH4]SOPLIN(NLIG), GMESSAGE) = [V]CST_AERROR
            GMESSAGE = func AFNC.MES1(mess(255,100,1),num$(NLIG+1))-GMESSAGE
            GERR=1 : NLIG=[M:SOH4]NBLIG
            Return
        Endif
        #If [M:SOH4]PRGBILNUM(NLIG)<>""
        If dim([M:SOH4]PRGBILNUM)> 0 & [M:SOH4]PRGBILNUM(NLIG)<>""
        # X3-200515 : Progress billing / X3-222013 : Progress billing - general test - 2020-12-15 by LD
          GMESSAGE = func AFNC.MES1(mess(291,191,1),num$([M:SOH4]SOPLIN(NLIG)))-[M:SOH4]PRGBILNUM(NLIG)
          GERR=1 : NLIG=[M:SOH4]NBLIG
        Endif
    # X3-200515 : Progress billing / X3-220424 : Blocking control on invoicing term update - 2020-11-03 by LD
    Endif
    
    Return
    # 79705 : SAT IN SPRICLINK : Step 2
    
    #------------------------------------------------------------------------------#
    # Appelé en am_modif : Date cde, Devise, Régime, Type prix,                    #
    #                      Représ., Demdlvdat, Daylti,                             #
    #                      Shidat, Dlvpîo, Mdl, Bptnum                             #
    #                      Adr livraison si GLINBPD = 1                            #
    #                      Site expédition                                         #
    #  --> Si dde Recherche tarif : GTARFLG= "1"                                   #
    #  --> Si modif.régime        : Recalc. prix, marge, totaux                    #
    #  --> Si modif.type prix     : Bascule prix                                   #
    #  --> Si modif.devise        : Conversion des montants                        #
    #  --> Si modif.des zones entêtes reportées dans les zones détails             #
    #      FFLGMOD = 1            : Modification de la zone détail                 #
    #      FFLGMOD = 3            : Comparaison et modification de la zone détail  #
    #      FFLGMOD = "",2         : Sur BPAADD, Répercution forcée car GLINREP=1   #
    #------------------------------------------------------------------------------#
    $RECALC_LIGNE
    Local Char     NOMD, NOME, ACT(1)
    Local Integer  NLIG, I, J, WIND, SPSTAT, ORI
    Local Decimal  MNTORI, MNTDES
    Local Char     VAT(GLONVAT)(3), WREP
    Local Char     WFLGTOT   : WFLGTOT="N"
    Local Integer  INICPRPRI : INICPRPRI=1
    Local Char     WVACITM(GLONTVI)(3)
    Local Integer  WMSG_SHIDAT, WMSG_EXTDLVDAT    : # Bug 71079
    
    Raz WMSG_SHIDAT, WMSG_EXTDLVDAT               : # Bug 71079
    
    Raz ACT
    
    If [M]ORDSTA = 2 Return : Endif
    
    If GTARFLG= "1" | [M:SOH1]CUR <> WANCCUR | [M:SOH1]VACBPR <> WANCVACBPR | find(WZONCOU,"BPCORD","STOFCY")
        Raz [M]ORDNOT, ORDATI, DLRNOT, DLRATI, PFMTOT
        Raz [M:SOH0]DSPTOTQTY,DSPTOTVOL,DSPTOTWEI       :#--CPO 80622 Il faut refaire les totaux
        # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
        Raz [M]INRNOT, INRATI, INRSCHNOT, INRSCHATI
        # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    Endif
    
    #----------------------------------------------------------------#
    # Modification des lignes détails en fonction des modifs entetes #
    #----------------------------------------------------------------#
    Local Integer WMODZON_RESPONSE : WMODZON_RESPONSE = 0 # Issue 107888 - 2016-09-09 by CPO : US155 Kit & flexible kit scheduled invoices
    Raz NLIG
    
    While NLIG < [M:SOH4]NBLIG
    
    # 107890 : Scheduled invoices : (LC:28/10/16)
      If ([M:SOH4]DLVFLG(NLIG)=2 or !find(WZONCOU,"DLVPIO","DEMDLVDAT","DAYLTI","SHIDAT","DEMDLVHOU","DRN","MDL","BPTNUM")
    &     or (WZONCOU="DEMDLVDAT" & [M:SOH0]SOHCAT=3))
    # The modification of these header fields only affects to the deliverable lines
    # 107890 : Scheduled invoices : (LC:28/10/16) (End)
        If [M:SOH4]SOQSTA(NLIG) <>  3
    #   Traitement uniquement si la ligne n'est pas soldée
            If FFLGMOD <> ""
                NOME = WZONCOU
                If NOME <> "REP"
                   NOMD = sum ("D", NOME)
                Else
                   WIND  = indice
                   NOMD = sum(NOME, num$(WIND+1))
                   NOME = sum(NOME, "(", num$(WIND), ")")
                Endif
                If FFLGMOD  = "3" Gosub COMP_ZON Endif
                If FFLGMOD <> "3" Gosub MOD_ZON  Endif
            Endif
            If WZONCOU = "BPCORD"
                Gosub REINIT_LIGNE : If mkstat=2 Break : Endif
            Endif
            If GTARFLG="1" | [M:SOH1]CUR <> WANCCUR | [M:SOH1]VACBPR <> WANCVACBPR |
    &                        [M:SOH1]PRITYP <> WANCPRITYP
                Call LECT_FIC(NLIG)
                If [M:SOH1]VACBPR <> WANCVACBPR
                    WVACITM(0) = [M:SOH4]VACITM1(NLIG)
                    WVACITM(1) = [M:SOH4]VACITM2(NLIG)
                    WVACITM(2) = [M:SOH4]VACITM3(NLIG)
                    #Call ALITAXEV([M:SOH1]VACBPR,WVACITM,VAT) From TRTX3
                    Call RECHVATCOD(1,1,[M:SOH0]BPCORD,[M:SOH4]ITMREF(NLIG),"SOH4",NLIG,VAT) From TRTX3
                    # Bug 75162 : Contrôle que le code taxe1 est bien renseigné
                    Call CTLVAT(VAT(0)) From TRTVENCTL
                    If mkstat=2
                        GMESSAGE = [M:SOH4]ITMREF(NLIG)-" : "-GMESSAGE : Break
                    Endif
                    # Bug 75162
                    [M:SOH4]VAT1(NLIG) = VAT(0)
                    [M:SOH4]VAT2(NLIG) = VAT(1)
                    [M:SOH4]VAT3(NLIG) = VAT(2)
                Endif
    #         --> Recherche tarif
                If GTARFLG = "1"
                    Gosub RECALC_TARIF
                Else
    #         --> modif. devise en dupplication : Conversion des montants + recalcul totaux
                    If [M:SOH1]CUR <> WANCCUR
                        Gosub CONV_LIGNE
                        WFLGTOT="O"
                    Endif
    #         --> Modif. regime de taxe         : Recalcul des prix, de la marge et des totaux
                    If [M:SOH1]VACBPR <> WANCVACBPR
                        WFLGTOT="O"
                    Endif
    #         --> Modif. Type de prix           : Bascule des prix HT et TTC
                    If [M:SOH1]PRITYP <> WANCPRITYP
                        Gosub RECALC_PRI
                    Endif
                Endif
    
                [M]UPDFLG(NLIG) = 1
            Endif
    #       --> Nécessité de refaire les totaux
            If WFLGTOT="O" Gosub RECALC_TOT Endif
            If [M]UPDFLG(NLIG) = 1 & GREV=2 [M]LINREVNUM(NLIG) = [M:SOH0]REVNUM : Endif
    # Bug 83665
        Else
    #   Si la ligne est soldée, il faut recalculer les totaux si nécessaire
          If GTARFLG="1" | [M:SOH1]CUR <> WANCCUR | [M:SOH1]VACBPR <> WANCVACBPR | find(WZONCOU,"BPCORD","STOFCY")
            Call ADD_TOT(NLIG)
          Endif
    # Bug 83665
        Endif  # 107890 : Scheduled invoices : (LC:28/10/16)
      Endif
        #---------------------------------------------------------------------#
        # Point d'entree pour intervenir en spécifique sur une ligne          #
        #---------------------------------------------------------------------#
        GPOINT="RECALCLIG" : Gosub ENTREE From EXEFNC
        # Issue X3-200515/X3-208171 - 2020-09-23 by SR : Control price and/or  amount
        If GDACLOK = 1 | (dim([M:SOH4]PRGBILNUM) > 1 & [M:SOH4]PRGBILNUM(NLIG) <> "")
            Call CTLNETPRI([M:SOH0]BPCORD,[M:SOH0]CHGTYP,[M:SOH0]ORDDAT,[M:SOH0]CUR,NLIG) From TRTVENPRI
            If mkstat = 2 :
              GMESSAGE = mess(18,197,1) - num$(NLIG+1) - GMESSAGE
              Break
            Endif
        Endif
        # End issue X3-200515/X3-208171
        NLIG+=1
    Wend
    Kill WMODZON_RESPONSE # Issue 107888 - 2016-09-09 by CPO : US155 Kit & flexible kit scheduled invoices
    If mkstat=2 Return Endif
    
    # 101874 : V9 : Taxe code control
    #If dim(GVALTTCSOH)>0 & dim(GVALTTC)>0 : GVALTTC=GVALTTCSOH : Endif
    #If !GIMPORT : Call VALTTC ("GESSOH") From TRTVENFACR : Endif
    If !GIMPORT
        # Valuation is always done in this case
        GVALTTC=2
        #---- Paramètres complementaires appel valorisation
        # PARAM_T(0) : Flag contrôle des taxes             (1=Non/2=Oui)
        # PARAM_T(1) : Lecture de la trace par le sous-pro (1=Non/2=Oui)
        # PARAM_T(2) : Flag retour                         (1=KO/2=OK)
        Local    Char     PARAM_T (25) (0..10)
        PARAM_T(0)="1"      : # Pas de contrôle des taxes
        PARAM_T(1)="1"      : # Pas de lecture de la trace
        PARAM_T(2)="0"
        Call VALTTC ("GESSOH", PARAM_T) From TRTVENFACR
        If PARAM_T(2)="1" mkstat=2 : Return Endif
    Endif
    # 101874
    
    If GREV=2 Affzo [M:SOH0]REVNUM Endif
    Affzo [M:SOH4]5,10,15,20
    
    Return
    
    #------------------------------------------------------#
    # Reinitialisation d'une ligne lors d'une dupplication #
    #------------------------------------------------------#
    $REINIT_LIGNE
    Local Integer I
    Local Char    SECTION
    Local Char    WREP, WSTOFCY
    Local Integer WRETOUR
    Local Char    WNUMTEX (12)
    
    
    WSTOFCY=[M:SOH4]DSTOFCY(NLIG)
    nolign=NLIG+1
    Call INIT_SOH (NLIG, 0)
    
    # On vérifie au moins que l'article n'est pas interdit
    If dim([M]REP1(NLIG)) > 0 WREP = [M]REP1(NLIG) : Endif
    [M:SOH0]BPCORD=VALEUR
    Call RECH_INTERDIT ([M]ITMREF(NLIG), [M]DBPAADD(NLIG), WREP, 2) From TRTVENTAR
    If mkstat = 2
        GMESSAGE = [M]ITMREF(NLIG)-" : "-GMESSAGE
        GMESSAGE += "\" + mess(206,192,1)
        Return
    Endif
    
    # 102681 : Duplication commande avec changement de client
    # --> Réinitialisation ligne commande à partir de la fiche article-client
    Gosub REINIT_ITU
    # 102681
    
    # Changement de site
    If WSTOFCY <> [M:SOH4]DSTOFCY(NLIG) Gosub MOD_DSTOFCY : Endif
    # On recharge les sections analytiques
    # A cause de l'INISEC "SOP" qui peut être paramétré avec [F:POP]
    If GMODU(6)=2 & GNBDIE>0 Raz [F:POP] : Endif
    For I = 1 To GNBDIE
        If evalue("dim([M]CCE"+num$(I)+"(NLIG))") >0
            Call INISEC(SECTION, "SOP", I) From TRTX3CPT
            Assign "[M]CCE"+num$(I)+"(NLIG)" With SECTION
        Endif
    Next
    Raz [M]USEPLC(NLIG)
    # On recherche la désignation traduite si le client a changé de langue
    If WANCLAN<>[M:SOH0]LAN
        Call CHARGE_ITMDES("DES1AXX", [M:SOH0]LAN,[F:ITM]ITMREF,[M:SOH4]ITMDES(NLIG)) From TRTX3   # FGR 29/06/2009 : X3SUIVI56129 : celui-là reste comme ça
        If [M:SOH4]ITMDES(NLIG) = "" [M:SOH4]ITMDES(NLIG) = [M:SOH4]ITMDES1(NLIG) Endif
    Endif
    # Le client a changé : On recharge les textes du nouveau client
    #If find(GSALTEXLIN,1,5) & find(left$([M:SOH4]SOQTEX(NLIG),3),"ITS","ITU")
    If find(GSALTEXLIN,1,5)
        If [F:ITU]ITMREF<>[M:SOH4]ITMREF (NLIG) | [F:ITU]BPCNUM<>[M:SOH0]BPCORD
            Read [F:ITU]ITU0 = [M:SOH4]ITMREF (NLIG);[M:SOH0]BPCORD
            If fstat  Raz [F:ITU] : Endif
        Endif
        If [F:ITU]ITSTEX <> ""
           # Récup du texte article du nouveau client s'il existe
           [M:SOH4]SOQTEX(NLIG) = [F:ITU]ITSTEX
        Elsif left$([M:SOH4]SOQTEX(NLIG),3)="ITU"
           # Ecrasement texte article ancien client
           [M:SOH4]SOQTEX(NLIG) = [F:ITS]ITSTEX
        Endif
    Endif
    
    # 89275 : Duplication cde et ctrl des prix
    # Faire un ctrl prix si pas de recherche tarif et si nécessaire
    Raz GNETMAR
    If GREP= "D" & WZONCOU= "BPCORD" & GTARFLG<>"1" & GDACLOK=1
      GNETMAR=1
      # --> Ctrl prix net
      Call CTLNETPRI([M:SOH0]BPCORD, [M]CHGTYP, [M]ORDDAT, [M:SOH0]CUR,NLIG) From TRTVENPRI
      Raz GNETMAR : Raz GMESSAGE
    Endif
    # 89275
    [M]UPDFLG(NLIG)=1
    If GTARFLG <> "1" WFLGTOT="O" Endif
    Return
    
    # 102681 : Duplication commande avec changement de client
    #  --------------------------------------------------------------------  #
    #  Réinitialisation ligne commande à partir de la fiche article-client  #
    #  --------------------------------------------------------------------- #
    $REINIT_ITU
    
    If [F:ITM]ITMREF <> [M:SOH4]ITMREF(NLIG)
       Read [ITM] ITM0=[M:SOH4]ITMREF(NLIG)
       If fstat Raz [F:ITM] Endif
    Endif
    If [F:ITU]ITMREF <> [M:SOH4]ITMREF(NLIG) | [F:ITU]BPCNUM <> [M:SOH0]BPCORD
       Read [ITU] ITU0=[M:SOH4]ITMREF(NLIG);[M:SOH0]BPCORD
       If fstat Raz [F:ITU] Endif
    Endif
    
    #  Réinitialisation de l'unité de vente si nécessaire
    Gosub REINIT_SAU
    
    #  Réinitialisation de la référence client
    [M:SOH4]ITMREFBPC(NLIG) = [F:ITU]ITMREFBPC
    
    Return
    
    #  -------------------------------------------------------------------  #
    #  Réinitialisation de l'unité de vente                                 #
    #  -------------------------------------------------------------------- #
    $REINIT_SAU
    Local Char    WSAUORI(GLONUOM) : WSAUORI       = [M:SOH4]SAU(NLIG)
    Local Decimal WSAUSTUCOEORI    : WSAUSTUCOEORI = [M:SOH4]SAUSTUCOE(NLIG)
    Local Decimal WDACSAUCOEORI    : WDACSAUCOEORI = [M:SOH4]DACSAUCOE(NLIG)
    Local Decimal WQTYORI          : WQTYORI       = [M:SOH4]QTY(NLIG)
    
    Local Char    WSAU
    Local Decimal WSAUSTUCOE, WQTYSAU, WQTY, WQTYSTU, WCOEINVERSE
    Local Integer WDACSAUCOE
    
    # On vérifie tout d'abord que l'UV est bien une unité de l'article
    # (Dans le cas où elle était l'UV définie pour le client de la cde dupliquée)
    WSAU=WSAUORI
    WSAUSTUCOE=WSAUSTUCOEORI
    WDACSAUCOE=WDACSAUCOEORI
    WQTYSAU=[M:SOH4]QTY(NLIG)
    Call CTLUOM([M:SOH4]ITMREF(NLIG), 2, [M:SOH0]BPCORD, WSAU, WSAUSTUCOE, GBIDC1, GBIDC2, WDACSAUCOE) From STKACT
    If mkstat=2
        # L'UV de la ligne de cde d'origine n'est pas une unité de l'article
        # On réinitialise l'UV avec l'UV de l'article client si elle existe ou avec l'UV de l'article
        mkstat=0 : Raz GMESSAGE
        WSAU       = [F:ITM]SAU
        WSAUSTUCOE = [F:ITM]SAUSTUCOE
        WDACSAUCOE = [F:ITM]DACSAUCOE
        If [F:ITU]SAU <> "" & find([M:SOH4]LINTYP(NLIG),1,2,6,10) & [M:SOH4]FOCFLG(NLIG) <> 3
            WSAU       = [F:ITU]SAU
            WSAUSTUCOE = [F:ITU]SAUSTUCOE
            WDACSAUCOE = 1
        Endif
    Endif
    
    # L'UV est une unité de l'article
    # L'UV n'est pas une unité de l'article et elle a été réinitialisée
    While WSAUSTUCOEORI<>WSAUSTUCOE
        # Le coefficient de conversion a changé
        # --> Il faut recalculer la qté cdée en UV
    
        # On recalcule la nouvelle la qté cdée UV en repartant de la qté US et du nouveau coefficient de conversion
        WQTYSAU=[M:SOH4]QTYSTU(NLIG) / WSAUSTUCOE
        Call QTEARR(WQTYSAU,WSAU) From TRTDIV
        # Conversion de la nvelle qté cdée UV en US pour voir si on obtient le même résultat
        WQTYSTU=WQTYSAU * WSAUSTUCOE
        Call QTEARR(WQTYSTU,[M:SOH4]STU(NLIG)) From TRTDIV
        If WQTYSTU=[M:SOH4]QTYSTU(NLIG)
            # On obtient la même qté US                     : On conserve l'unité
            Break
        Else
            # On obtient pas la même qté US                 : On change l'unité
            If WSAU=[F:ITU]SAU
                # Si l'UV était l'UV de l'article client, on prend l'UV de l'article
                WSAU=[F:ITM]SAU
                WSAUSTUCOE = [F:ITM]SAUSTUCOE
                WDACSAUCOE = [F:ITM]DACSAUCOE
            Elsif WSAU=[F:ITM]SAU
                # Si l'UV était l'UV de l'article, on prend l'US de l'article
                WSAU=[F:ITM]STU
                WSAUSTUCOE = 1
                WDACSAUCOE = 1
                WQTYSAU=[M:SOH4]QTYSTU(NLIG)
                Break
            Else
                # Si l'UV était une unité de conditionnement, on prend l'UV de l'article client
                WSAU=[F:ITU]SAU
                WSAUSTUCOE = [F:ITU]SAUSTUCOE
                WDACSAUCOE = 1
            Endif
        Endif
    Wend
    
    # On a gardé l'unité de vente et le coefficient d'origine
    If WSAUORI=WSAU & WSAUSTUCOEORI=WSAUSTUCOE Return Endif
    
    # On a modifié l'unité de vente ou le coefficient de conversion
    
    # --> Réinitialisation de la ligne avec les nouvelles valeurs
    [M:SOH4]SAU(NLIG)=WSAU
    [M:SOH4]SAUSTUCOE(NLIG)=WSAUSTUCOE
    [M:SOH4]DACSAUCOE(NLIG)=WDACSAUCOE
    [M:SOH4]QTY(NLIG)=WQTYSAU
    
    # --> Réinitialisation de l'emballage et de la capacité
    # Si l'unité est une unité article client et si l'emballage est différent de celui de la ligne
    If find([M:SOH4]SAU(NLIG), [F:ITU]SAU,[F:ITU]PCU1,[F:ITU]PCU2) & [F:ITU]PCK<>"" & [F:ITU]PCK<>[M:SOH4]PCK(NLIG)
        [M:SOH4]PCK(NLIG)       = [F:ITU]PCK
        [M:SOH4]PCKCAP(NLIG)    = [F:ITU]PCKCAP
    Endif
    
    # --> Réinitialisation des qtés
    # Recalcul de la qté à allouer
    WCOEINVERSE=1/[M:SOH4]SAUSTUCOE(NLIG)
    If [M:SOH4]WALLQTYSTU(NLIG)<>0
        Call CNVQTY([M:SOH4]WALLQTYSTU(NLIG),WCOEINVERSE,[M:SOH4]SAU(NLIG),[M:SOH4]WALLQTY(NLIG)) From TRTVENQTE
    Endif
    
    WFLGTOT="O"
    
    # On a gardé le coefficient d'origine
    If WSAUSTUCOEORI=WSAUSTUCOE Return Endif
    
    # On a modifié le coefficient de conversion
    
    If [M:SOH4]FOCFLG(NLIG)=3 Return Endif
    # --> Réinitialisation des prix
    Gosub REINIT_PRI
    
    Return
    
    #  -------------------------------------------------------------------  #
    #  Réinitialisation des prix                                            #
    #  -------------------------------------------------------------------  #
    $REINIT_PRI
    Local Decimal WGROPRIORI       : WGROPRIORI    = [M:SOH4]GROPRI(NLIG)
    Local Decimal WNETPRIORI       : WNETPRIORI    = [M:SOH4]NETPRI(NLIG)
    Local Decimal WNETPRINOTORI    : WNETPRINOTORI = [M:SOH4]NETPRINOT(NLIG)
    Local Decimal WNETPRIATIORI    : WNETPRIATIORI = [M:SOH4]NETPRIATI(NLIG)
    
    # --> Recalcul des montants de base calcul de taxe
    If WQTYORI<>[M:SOH4]QTY(NLIG)
        Local    Decimal WUNTCLCAMT1, WUNTCLCAMT2 : Raz WUNTCLCAMT1, WUNTCLCAMT2
        If WQTYORI <> 0
            WUNTCLCAMT1=[M:SOH4]CLCAMT1(NLIG): WQTYORI : WUNTCLCAMT2=[M:SOH4]CLCAMT2(NLIG)/WQTYORI
        Endif
        Call ALICLCAMT([M:SOH4]ITMREF(NLIG), [M:SOH4]QTY(NLIG), NLIG, "SOH4", [M:SOH4]CLCAMT1(NLIG), [M:SOH4]CLCAMT2(NLIG)) From TRTX3
    Endif
    
    # --> Recalcul du prix brut
    If WGROPRIORI<>0
        [M:SOH4]GROPRI(NLIG)=WGROPRIORI*(1/WSAUSTUCOEORI)*[M:SOH4]SAUSTUCOE(NLIG)
    Endif
    
    # --> Recalcul du prix net
    If WGROPRIORI<>[M:SOH4]GROPRI(NLIG)
        # Bug 70861 : Recalcul prix net si recherche tarif ou si ligne directe (car impact des frais/remise par ligne sur le prix net)
        WNETPRIORI   =[M:SOH4]NETPRI(NLIG)
        WNETPRINOTORI=[M:SOH4]NETPRINOT(NLIG) : WNETPRIATIORI=[M:SOH4]NETPRIATI(NLIG)
        Call CLCNETPRI([M:SOH4]QTY(NLIG), [M:SOH0]CUR, NLIG) From TRTVENPRI
    Endif
    
    Return
    # 102681
    
    
    #-------------------------------------#
    # Comparaison zone entête/zone détail #
    #-------------------------------------#
    $COMP_ZON
    #If evalue("[M:SOH4]"+NOMD+"(NLIG)") <> evalue("[M]"+NOME) : Return : ENDIF
    #If evalue("dim([M:SOH4]"+NOMD+"(NLIG))") >0 & evalue("dim([M:SOH2]"+NOME+")") >0
    If evalue("dim([M:SOH4]"+NOMD+"(NLIG))") >0 & evalue("dim([M]"+NOME+")") >0
        If evalue("[M:SOH4]"+NOMD+"(NLIG)") <> evalue("[M]"+NOME) : Return : Endif
    Else
        Return
    Endif
    
    #-------------------------------------#
    # Modification de la zone détail      #
    #-------------------------------------#
    $MOD_ZON
    
    #Gbn-86074-Ajout PE pour inhiber le report de modif sur les lignes
    Local Integer WGPE : WGPE=0
    GPOINT="NOUPDLIN" : Gosub ENTREE From EXEFNC
    
    If WGPE=1 & (NOME="STOFCY" | (NOME="BPAADD" & GLINBPD=1)) : WGPE=0 : Endif # Pas de modif de comportement pour STOFCY et BPAADD
    If WGPE=1 : WGPE=0 : Return : Endif                                        # si WGPE=1, pas de report sur les lignes pour les autres infos
    
    If NOME = "STOFCY"
        If GTARFLG <> "1" WFLGTOT="O" Endif
        # On ne fait rien si la ligne est partiellement allouée, préparée ou livrée ou facturée
        If sum([M]ALLQTY(NLIG),[M]SHTQTY(NLIG),[M]LPRQTY(NLIG),[M]OPRQTY(NLIG),[M]PREQTY(NLIG),[M]ODLQTY(NLIG),[M]DLVQTY(NLIG),[M]INVQTY(NLIG)) <> 0
             Return
        Endif
    Endif
    # Priorité de livraison : Forcer la mise des encours
    If NOME = "DLVPIO"
        If [M:SOH4]WIPFLG(NLIG) = "" [M:SOH4]WIPFLG(NLIG) = "M" : Endif
    Endif
    
    # Particularité sur BPAADD : Bien que FFLGMOD="" ou "2" (non) on passe ici :
    # car GLINREP=1 et il faut de toute façon répercuter les représentants
    #If find(FFLGMOD,"1","3") Assign "[M:SOH4]"+NOMD+"(NLIG)" With VALEUR : Endif
    If find(FFLGMOD,"1","3")
        If evalue("dim([M:SOH4]"+NOMD+"(NLIG))") >0
            # 107890 : Scheduled invoices : (LD:08/12/15)
            # Invoicing condition is managed only for undeliverable item
            # Invoicing condition is modified only if the line is not invoiced
            #Assign "[M:SOH4]"+NOMD+"(NLIG)" With VALEUR
            If NOME = "INVCND"
                # X3-200515 : Progress billing / X3-220424 : Blocking control on invoicing term update - 2020-11-03 by LD
                # we can't modify the invoicing term on a line linked to a progress billing
                If dim([M:SOH4]PRGBILNUM)> 0 & [M:SOH4]PRGBILNUM(NLIG)<>"" Return : Endif
                # X3-200515 : Progress billing / X3-220424 : Blocking control on invoicing term update - 2020-11-03 by LD
                # X3-200515 : Progress billing / X3-222013 : Progress billing - general test - 2020-12-15 by LD
                # we can't modify the invoicing term on a line with scheduled invoices linked with a milestone
                # this line is not processed
                If find(GREP,"C","D")=0 and [M:SOH4]DINVCND(NLIG)<>"" and [M:SOH4]DINVCND(NLIG)<>VALEUR
                  If func TRTVENDIV.VERF_SVICD_PJTMST([M:SOH0]SOHNUM, [M:SOH4]SOPLIN(NLIG), [M:SOH4]SOPLIN(NLIG), GBIDC1) = [V]CST_AERROR
                      Return
                  Endif
                Endif
                # X3-200515 : Progress billing / X3-222013 : Progress billing - general test - 2020-12-15 by LD
                If [M:SOH4]DLVFLG(NLIG)=1 & [M:SOH4]INVFLG(NLIG)=1
                    # Issue 107888 - 2016-09-09 by CPO : US155 Kit & flexible kit scheduled invoices
                    #--An existing invoice condition cannot be changed if at list one invoice condition line
                    #--has a status different then "To be invoiced"
                    If clalev([F:SVICD])=0 : Local File SVCRINVCNDD [SVICD] : Endif
    
                    If find(GREP,"C","D")=0 and [M:SOH4]DINVCND(NLIG)<>"" and [M:SOH4]DINVCND(NLIG)<>VALEUR
                      Filter [SVICD] Where VCRTYP    = 10   and
    &                      VCRNUMORI = [M:SOH0]SOHNUM       and
    &                      VCRLINORI = [M:SOH4]SOPLIN(NLIG) and
    &                      VCRSEQORI = [M:SOH4]SOPLIN(NLIG) and
    &                      INVCNDSTA > 1
                      Read [SVICD] First
                      If fstat=0
                        Filter [SVICD]
                        #--Message...
                        #--"Already existing entry. Creation not suitable !"
                        mkstat =2
                        # Issue X3-200515/X3-223633 - 2020-11-25 by SR : change message "Import"
                        #GMESSAGE = mess(3,61,1)-num$(NLIG+1)-mess(162,154,1)-[M:SOH4]ITMREF(NLIG)+":"+mess(500,192,1) #"L'échéancier est déjà généré et il contient des lignes facturées/soldées !"
                        GMESSAGE = func AFNC.MES1(mess(255,100,1),num$(NLIG+1))-mess(162,154,1)-[M:SOH4]ITMREF(NLIG)+":"+mess(500,192,1)
                        # 107888 : Scheduled invoices : X3-4962 (LD:12/10/16)
                        # We should ended ?
                        #Return
                        # 107888 : Scheduled invoices : X3-4962 (LD:12/10/16)
                      Endif
                      Filter [SVICD]
                    Endif
                    #--CPO This trigger the warning about deletion of the previous scheduling invoice
                    #--If you don't wont this, then copy here the entire AM_DINVCND code without the wanrning...
                    #Below, code taken from Call AM_DINVCND(VALEUR) From SUBSOH in order to avoid the Call AVERTIR everytime
                    #-----------------------------------------------------------
                    #--The "C_DINVCND" done above will prevent changing an invoice condition if already invoiced lines
                    #--If an existing invoice condition is code is changed, the new one will be generated and the existing deleted
                    #--As the invoice condition is created into the database at the same time at the order,
                    #--the rule only apply while modifying the order lien
                    If [M:SOH4]DINVCND(NLIG)<>VALEUR
                      #--New invoice condition => we start from scratch
                      If dim(GSOHVCRINVCND_UPD)>0 and GSOHVCRINVCND_UPD(NLIG)<>null
                        FreeGroup GSOHVCRINVCND_UPD(NLIG)
                        GSOHVCRINVCND_UPD(NLIG)=null
                      Endif
                    Endif
                    If [M:SOH4]DINVCND(NLIG)<>"" and [M:SOH4]DINVCND(NLIG)<>VALEUR
    &                                            and [M:SOH4]DINVCNDTODEL(NLIG)=[V]CST_ANO
                      If find(GREP,"C","D")=0
                        If WMODZON_RESPONSE=0 #--in order to trigger the message only once for all elements
                          GERR=0
                          WMODZON_RESPONSE=1
                          # X3-200515 : Progress billing / X3-220424 : Blocking control on invoicing term update - 2020-11-03 by LD
                          #Call AVERTIR(mess(3,61,1)-num$(NLIG+1)-mess(162,154,1)-[M:SOH4]ITMREF(NLIG)+":"+mess(490,192,1),WMODZON_RESPONSE) From GESECRAN
                          Call AVERTIR(func AFNC.MES1(mess(255,100,1),num$(NLIG+1))-mess(162,154,1)-[M:SOH4]ITMREF(NLIG)+":"+mess(490,192,1),WMODZON_RESPONSE) From GESECRAN
                          # X3-200515 : Progress billing / X3-220424 : Blocking control on invoicing term update - 2020-11-03 by LD
                          If WMODZON_RESPONSE<2 : mkstat=2 : Endif
                          # 107888 : Scheduled invoices : X3-4962 (LD:12/10/16)
                          # We should ended ?
                          # If mkstat=2 Return endif
                          # 107888 : Scheduled invoices : X3-4962 (LD:12/10/16)
                        Endif
                        #--Setting the "to delete" flag and filling the invoice condition code to be deleted
                        If mkstat=0
                          [M:SOH4]DINVCNDTODEL(NLIG)=[V]CST_AYES
                          [M:SOH4]DINVCNDPREV (NLIG)=[M:SOH4]DINVCND(NLIG)
                        Endif
                      Else
                        #--In this case, in LIBSAL_INVCND_SOH_BOM we need the flag to set the kit lines's invoice condition to the same value
                        If [M:SOH4]LINTYP(NLIG)=6 and mkstat = 0
                          [M:SOH4]DINVCNDUPDK(NLIG)=[V]CST_AYES
                        Endif
                      Endif
                    Endif
                    #--Also, if the user re-fill the former value, we have to unset the "to delete" flag
                    If mkstat = 0
                      If VALEUR=[M:SOH4]DINVCNDPREV(NLIG) and [M:SOH4]DINVCNDTODEL(NLIG)=[V]CST_AYES
                        [M:SOH4]DINVCNDTODEL(NLIG)=[V]CST_ANO
                        [M:SOH4]DINVCNDPREV (NLIG)=""
                        [M:SOH4]DINVCNDUPDK(NLIG)=[V]CST_ANO
                      Endif
                    [M:SOH4]DINVCNDTOUPD(NLIG)=[V]CST_AYES
                    [M:SOH4]DINVCNDTODIS(NLIG)=[V]CST_ANO
                    #-----------------------------------------------------------
                    # End issue 107888
                      Assign "[M:SOH4]"+NOMD+"(NLIG)" With VALEUR
                    Else
                      Raz mkstat : Return #--Avoid setting UPDFLG further below
                    Endif
                Endif
            Else
                Assign "[M:SOH4]"+NOMD+"(NLIG)" With VALEUR
            Endif
            # 107890 : Scheduled invoices : (LD:08/12/15)
        Endif
    Endif
    #SAM 110881
    
    If NOMD="DDEMDLVDAT" and func AFNC.ACTIV("EDIX3")>0
      If [M:SOH4]DDEMDLVDAT(NLIG)> [M:SOH4]MAXDLVDAT(NLIG):   [M:SOH4]MAXDLVDAT(NLIG)=[M:SOH4]DDEMDLVDAT(NLIG): Endif
    Endif
    #End SAM 110881
    [M:SOH4]UPDFLG(NLIG) = 1
    # --- Modification de l'adresse de livraison
    If NOME = "BPAADD"
        If W_ALICDE=2
    #       Réalimentation des zones issues du client
            Gosub MOD_BPAADD
        Elsif find(FFLGMOD,"1","3")
    #       Pas de réalimentation des zones issues du client on récupère uniquement le contact
            If dim([M:ADB2]CNTNAM)>0 [M:SOH4]CNDNAM(NLIG) = [M:ADB2]CNTNAM : Endif
        Endif
    Endif
    # --- Modification du site expédition et livraison commande complète
    If NOME = "STOFCY" Gosub MOD_DSTOFCY : Endif
    # --- Modification de la Date de livraison demandée et du délai
    #     ==> Recalcul de la date d'expédition et de la date de livraison prévue
    If NOME = "DEMDLVDAT" | NOME = "DAYLTI"
        Gosub CALC_SHIDAT
        # Bug 71079
        If mkstat & WMSG_SHIDAT=0
            #Call MESSAGE([M:SOH4]ITMREF(NLIG)-":"-mess(278,192,1)-format$(GFMD,[M:SOH4]DSHIDAT(NLIG))-"\"-GMESSAGE) From GESECRAN
            Call MESSAGE(mess(278,192,1)-"\"-GMESSAGE) From GESECRAN
            WMSG_SHIDAT=1
        Endif
        mkstat=0 : Raz GMESSAGE
        # Bug 71079
        Gosub CALC_EXTDLVDAT
        # Bug 71079
        If mkstat & WMSG_EXTDLVDAT=0
            #Call MESSAGE([M:SOH4]ITMREF(NLIG)-":"-mess(279,192,1)-format$(GFMD,[M:SOH4]EXTDLVDAT(NLIG))-"\"-GMESSAGE) From GESECRAN
            Call MESSAGE(mess(279,192,1)-"\"-GMESSAGE) From GESECRAN
            WMSG_EXTDLVDAT=1
        Endif
        mkstat=0 : Raz GMESSAGE
        # Bug 71079
    Endif
    # --- Modification de la Date d'expédition
    #     ==> Recalcul de la date de livraison prévue
    If NOME = "SHIDAT"
        Gosub CALC_EXTDLVDAT
        # Bug 71079
        If mkstat & WMSG_EXTDLVDAT=0
            #Call MESSAGE([M:SOH4]ITMREF(NLIG)-":"-mess(279,192,1)-format$(GFMD,[M:SOH4]EXTDLVDAT(NLIG))-"\"-GMESSAGE) From GESECRAN
            Call MESSAGE(mess(279,192,1)-"\"-GMESSAGE) From GESECRAN
            WMSG_EXTDLVDAT=1
        Endif
        mkstat=0 : Raz GMESSAGE
        # Bug 71079
    Endif
    # --- Modification des représentants : Recherche des taux de commissions
    If find(NOME,"REP(0)","REP(1)")
        Assign ("[M:SOH4]REPRAT"+num$(WIND+1)+"(NLIG)") With 0
        WREP=VALEUR
        Gosub MOD_REP
    Endif
    
    Return
    
    #--------------------------------------------------------#
    # Modification de l'adresse de livraison                 #
    #--------------------------------------------------------#
    $MOD_BPAADD
    
    # If find(FFLGMOD,"1","3")                           :# 107890 : Scheduled invoices : (LC:28/11/16)
    If find(FFLGMOD,"1","3") and [M:SOH4]DLVFLG(NLIG)<>1 :# 107890 : Scheduled invoices : (LC:28/11/16)
        [M:SOH4]DDRN(NLIG)    = [M:SOH2]DRN
        [M:SOH4]DDLVPIO(NLIG) = [M:SOH2]DLVPIO
        [M:SOH4]DDAYLTI(NLIG) = [M:SOH2]DAYLTI
        Gosub CALC_SHIDAT    : # Recalcul de la date d'expédition
        # Bug 71079
        If mkstat & WMSG_SHIDAT=0
            #Call MESSAGE([M:SOH4]ITMREF(NLIG)-":"-mess(278,192,1)-format$(GFMD,[M:SOH4]DSHIDAT(NLIG))-"\"-GMESSAGE) From GESECRAN
            Call MESSAGE(mess(278,192,1)-"\"-GMESSAGE) From GESECRAN
            WMSG_SHIDAT=1
        Endif
        mkstat=0 : Raz GMESSAGE
        # Bug 71079
        Gosub CALC_EXTDLVDAT : # Recalcul de la date de livraison prévue
        # Bug 71079
        If mkstat & WMSG_EXTDLVDAT=0
            #Call MESSAGE([M:SOH4]ITMREF(NLIG)-":"-mess(279,192,1)-format$(GFMD,[M:SOH4]EXTDLVDAT(NLIG))-"\"-GMESSAGE) From GESECRAN
            Call MESSAGE(mess(279,192,1)-"\"-GMESSAGE) From GESECRAN
            WMSG_EXTDLVDAT=1
        Endif
        mkstat=0 : Raz GMESSAGE
        # Bug 71079
        [M:SOH4]DMDL(NLIG)    = [M:SOH2]MDL
        [M:SOH4]DBPTNUM(NLIG) = [M:SOH2]BPTNUM
        If dim([M:ADB2]CNTNAM)>0
            [M:SOH4]CNDNAM(NLIG) = [M:ADB2]CNTNAM
        Endif
    Endif
    # Particularité si GLINREP=1 il faut de toute façon répercuter les représentants
    # --> Alimentation des commissions représentants
    For WIND=0 To dim([M:SOH1]REP)-1
      WREP = evalue("[M:SOH1]REP("+num$(WIND)+")")
      Assign ("[M:SOH4]REP"+num$(WIND+1)+"(NLIG)") With WREP
      Assign ("[M:SOH4]REPRAT"+num$(WIND+1)+"(NLIG)") With 0
      Gosub MOD_REP
    Next
    Return
    #--------------------------------------------------------#
    # Modification du site expédition de la zone détail      #
    #--------------------------------------------------------#
    $MOD_DSTOFCY
    Local Integer WFMI
    Local Integer WSTOMGTCOD, WI
    Local Char    WTSCCOD(GLONADI) (0..5)
    Local Char    WTSICOD(GLONADI) (0..5)
    
    # Changement de site : il faudra reinitialiser le prix de revient
    INICPRPRI=2
    
    WSTOMGTCOD=[M:SOH4]STOMGTCOD(NLIG)
    # Si modification du site, il faut recharger STOMGTCOD
    If [F:ITM]ITMREF <> [M]ITMREF(NLIG)
        Read [ITM]ITM0=[M]ITMREF(NLIG)
        If fstat Raz [F:ITM] Endif
    Endif
    [M:SOH4]STOMGTCOD(NLIG)  = [F:ITM]STOMGTCOD
    [M:SOH4]YSTOMGTCOD(NLIG) = [F:ITM]STOMGTCOD : # Bug 55476
    If [F:ITM]STOMGTCOD>1
        If [F:ITF]ITMREF<>[M]ITMREF(NLIG) | [F:ITF]STOFCY<>[M]DSTOFCY(NLIG)
            Read [ITF] ITF0=[M]ITMREF(NLIG);[M]DSTOFCY(NLIG)
            If fstat Raz [F:ITF] : Endif
        Endif
        [M:SOH4]STOMGTCOD(NLIG)  = [F:ITF]STOMGTCOD
        [M:SOH4]YSTOMGTCOD(NLIG) = [F:ITF]STOMGTCOD : # Bug 55476
    Endif
    
    # Réalimenter le code FMI qui vient de l'article site
    Call ALIFMI([M]ITMREF(NLIG), [M]DSTOFCY(NLIG), WFMI) From TRTVENCDE
    [M]FMI(NLIG)=WFMI
    If find([M]FMI(NLIG),3,5) [M]DALLTYP(NLIG)=2 Endif
    
    # L'article devient non géré en stock, il faudra supprimer l'encours
    If WSTOMGTCOD<>[M:SOH4]STOMGTCOD(NLIG) & [M:SOH4]STOMGTCOD(NLIG)=1 [M]WIPFLG(NLIG) = "A"
    Elsif [M]WIPFLG(NLIG) = "" [M]WIPFLG(NLIG) = "M" Endif
    
    # Si modification du site, réinitialisation du code prépa
    If dim([M:SOH0]TSCCOD) <> -1
        For WI = 1 To dim([M:SOH0]TSCCOD)
            WTSCCOD(WI-1) = [M:SOH0]TSCCOD(WI-1)
        #--CPO 90371 Lors de la correction de cette fiche - ici on fait For WI et Next I
        #Next I
        Next WI
        #--/
    Endif
    If dim([M:SOH4]TSICOD1)>0: WTSICOD(0) = [M:SOH4]TSICOD1(NLIG): Endif
    If dim([M:SOH4]TSICOD2)>0: WTSICOD(1) = [M:SOH4]TSICOD2(NLIG): Endif
    If dim([M:SOH4]TSICOD3)>0: WTSICOD(2) = [M:SOH4]TSICOD3(NLIG): Endif
    If dim([M:SOH4]TSICOD4)>0: WTSICOD(3) = [M:SOH4]TSICOD4(NLIG): Endif
    If dim([M:SOH4]TSICOD5)>0: WTSICOD(4) = [M:SOH4]TSICOD5(NLIG): Endif
    If [F:BPC]BPCNUM<>[M:SOH0]BPCORD
       Read [BPC]BPC0=[M:SOH0]BPCORD : If fstat Raz [F:BPC] Endif
    Endif
    Call REC_PRECOD([M]DSTOFCY(NLIG),[M:SOH4]ITMREF(NLIG),[F:ITM]TCLCOD,WTSICOD(0),
    &               WTSICOD(1),WTSICOD(2),WTSICOD(3),WTSICOD(4),[M:SOH0]BPCORD,
    &               [F:BPC]BCGCOD,WTSCCOD(0),WTSCCOD(1),WTSCCOD(2),WTSCCOD(3),
    &               WTSCCOD(4),[M:SOH4]PRECOD(NLIG)) From STKLIB
    
    WFLGTOT="O"
    
    # V6 Règle affectation : # GH 19/11/13 bug 94472
    If dim([M:SOH4]PTOCOD)>0
       [M:SOH4]PTOCOD(NLIG) = func ITMLIB.GET_PTOCOD([M:SOH4]ITMREF(NLIG),[M]DSTOFCY(NLIG))
    Endif
    Return
    
    #--------------------------------------------------------#
    # Modification du site expédition de la zone détail      #
    #--------------------------------------------------------#
    $SVGMOD_DSTOFCY
    Local Integer WFMI
    Local Integer WSTOMGTCOD
    
    # Changement de site : il faudra reinitialiser le prix de revient
    INICPRPRI=2
    # Réalimenter le code FMI qui vient de l'article site
    Call ALIFMI([M]ITMREF(NLIG), [M]DSTOFCY(NLIG), WFMI) From TRTVENCDE
    If WFMI <> [M]FMI(NLIG)
        If [F:ITM]ITMREF <> [M]ITMREF(NLIG)
           Read [ITM]ITM0=[M]ITMREF(NLIG)
           If fstat Raz [F:ITM] Endif
        Endif
        WSTOMGTCOD=[F:ITM]STOMGTCOD
    Else
        WSTOMGTCOD=[M]STOMGTCOD(NLIG)
    Endif
    [M]STOMGTCOD(NLIG) = WSTOMGTCOD
    [M]FMI(NLIG)=WFMI
    If find([M]FMI(NLIG),3,5) [M]DALLTYP(NLIG)=2 Endif
    
    If [M]WIPFLG(NLIG) = "" [M]WIPFLG(NLIG) = "M" Endif
    WFLGTOT="O"
    Return
    #-------------------------------------#
    # Recalcul date expedition            #
    #-------------------------------------#
    $CALC_SHIDAT
    Call CALC_SHIDAT([M:SOH4]DDEMDLVDAT(NLIG), [M:SOH4]DDAYLTI(NLIG), [M:SOH4]DSTOFCY(NLIG), 1, 1,[M:SOH0]ORDDAT, [M:SOH4]DSHIDAT(NLIG)) From TRTVENDAT
    #mkstat=0 : Raz GMESSAGE    : # Bug 71079
    Return
    #-------------------------------------#
    # Recalcul date livraison prévue      #
    #-------------------------------------#
    $CALC_EXTDLVDAT
    Call CALC_DLVDAT([M:SOH4]DSHIDAT(NLIG), [M:SOH4]DDAYLTI(NLIG), [M:SOH4]DBPAADD(NLIG), [M:SOH0]BPCORD, 0,0,
    &                [M:SOH4]EXTDLVDAT(NLIG)) From TRTVENDAT
    #mkstat=0 : Raz GMESSAGE    : # Bug 71079
    Return
    #---------------------------------------------------------------------------------#
    #  Suite à la modification d'un représentant : Recherche des taux de commissions  #
    #---------------------------------------------------------------------------------#
    $MOD_REP
    If WREP <> ""
        If [F:REP]REPNUM <> WREP
            Read [F:REP]REP0 = WREP
            If fstat Raz [F:REP] : Endif
        Endif
        If [F:BPC]BPCNUM <> [M:SOH0]BPCORD
            Read [F:BPC]BPC0 = [M:SOH0]BPCORD
            If fstat Raz [F:BPC] :Endif
        Endif
        If [F:BPC]COMCAT <> 0
            Assign ("[M:SOH4]REPRAT"+num$(WIND+1)+"(NLIG)") With evalue("[F:REP]COMRAT"+num$(WIND+1)+"([F:BPC]COMCAT-1)")
        Endif
    Endif
    Return
    
    #-------------------------------------#
    # Convertion des montants lignes      #
    #-------------------------------------#
    $CONV_LIGNE
    
    Call CONVERT2(WANCCUR, [M:SOH1]CUR, GLOCALDEV, [M]CHGTYP, date$, [M]GROPRI(NLIG), MNTDES, SPSTAT) From TRTDEV
    [M]GROPRI(NLIG) = arr(MNTDES, 10^-GDECPRI)
    
    For I = 1 To 9
        If evalue ("dim([m:soh4]discrgval"+num$(I)+"(nlig))")>0
            If GFMTREM(I-1)="M"
                MNTORI = evalue("[m:soh4]discrgval"+num$(I)+"(NLIG)")
                Call CONVERT(WANCCUR, [M:SOH1]CUR, GLOCALDEV, [M]CHGTYP, date$, MNTORI, MNTDES, SPSTAT) From TRTDEV
                Assign "[m:soh4]discrgval"+num$(I)+"(NLIG)" With MNTDES
            Endif
        Endif
    Next
    Call CONVERT2(WANCCUR, [M:SOH1]CUR, GLOCALDEV, [M]CHGTYP, date$, [M]NETPRI(NLIG), MNTDES, SPSTAT) From TRTDEV
    [M]NETPRI(NLIG) = arr(MNTDES, 10^-GDECPRI)
    
    Call CONVERT2(WANCCUR, [M:SOH1]CUR, GLOCALDEV, [M]CHGTYP, date$, [M]CPRPRI(NLIG), MNTDES, SPSTAT) From TRTDEV
    [M]CPRPRI(NLIG) = arr(MNTDES, 10^-GDECPRI)
    
    # Traitement des montants de base de calcul
    If [M]CLCAMT1(NLIG) <> 0 | [M]CLCAMT2(NLIG) <> 0
        # Ces montants dépendent d'une formule donc d'opérandes divers
        # Pas de conversion mais Recalcul
        Call ALICLCAMT([M]ITMREF(NLIG), [M]QTY(NLIG), NLIG, "SOH4", [M]CLCAMT1(NLIG), [M]CLCAMT2(NLIG)) From TRTX3
    Endif
    Return
    
    #-------------------------------------#
    # Rebascul des prix HT et TTC         #
    #-------------------------------------#
    $RECALC_PRI
    If [M]PRITYP=1
       [M]NETPRI(NLIG) = [M]NETPRINOT(NLIG)
    Else
       [M]NETPRI(NLIG) = [M]NETPRIATI(NLIG)
    Endif
    Return
    
    #-------------------------------------#
    # Recalcul des totaux                 #
    #-------------------------------------#
    $RECALC_TOT
    If WFLGTOT="O"                                               : # 89275 : Duplication cde et ctrl des prix
        Call CLCPFM([M]DSTOFCY(NLIG), [M:SOH1]PRITYP, [M]CHGTYP, [M:SOH0]ORDDAT, [M:SOH0]CUR,
    &           NLIG,INICPRPRI) From TRTVENPRI
    Endif                                                         : # 89275
    If GREP= "D" & WZONCOU= "BPCORD" & GDACLOK=1 GNETMAR=1 Endif  : # 89275
    Call CTLPFM([M:SOH0]CUR,[M:SOH4]CPRPRI(NLIG), NLIG) From TRTVENPRI
    # 89275
    If GREP= "D" & WZONCOU= "BPCORD" & GDACLOK=1
      Raz GNETMAR : Raz GMESSAGE
    Endif
    # 89275
    
    mkstat=0
    Gosub CALC_ORD
    Gosub CALC_DSP From TRTVENDIV
    If [M]DEMSTA(NLIG) =  1 Gosub CALC_DLR : Endif
    Call ADD_TOT(NLIG)
    Return
    
    #-------------------------------------#
    # Recalcul des tarifs                 #
    #-------------------------------------#
    $RECALC_TARIF
    Local Integer TYPRECH
    Local Decimal GROPRI
    
    If find([M]LINTYP(NLIG),1,2,6,10)
        TYPRECH = 1
    Else
        Local Integer ORI : ORI=NLIG
        While !find([M]LINTYP(ORI),2,6,10) & ORI >= 0 ORI-=1 Wend
        If find([M]LINTYP(ORI),2,6,10) GPNTITMREF=[M]ITMREF(ORI) Endif
        TYPRECH = 4
    Endif
    If [M]FOCFLG(NLIG) = 3  Return : Endif
    
    Call ALICLCAMT([M:SOH4]ITMREF(NLIG), [M:SOH4]QTY(NLIG), NLIG, "SOH4", [M:SOH4]CLCAMT1(NLIG), [M:SOH4]CLCAMT2(NLIG)) From TRTX3
    Call RECH_TARIF(TYPRECH,[M]ITMREF(NLIG),NLIG,[M]QTY(NLIG),"SOH",GROPRI) From TRTVENTAR
    # Action sur les gratuits
    # La ligne était à l'origine d'un gratuit et la nvelle recherche ne ramène aucun gratuit
    # -- > Suppression du gratuit
    If GFOCITMREF  = "" & [M]FOCFLG(NLIG) = 2  ACT = "S":[M]FOCFLG(NLIG)=1: Endif
    # La ligne était à l'origine d'un gratuit et la nvelle recherche ramène un gratuit
    # -- > Remplacement du gratuit
    If GFOCITMREF <> "" & [M]FOCFLG(NLIG) = 2  ACT = "C": Endif
    # La ligne n'était pas à l'origine d'un gratuit et la nvelle recherche ramène un gratuit
    # -- > Insertion du gratuit
    If GFOCITMREF <> "" & [M]FOCFLG(NLIG) = 1  ACT = "I": Endif
    [M]GROPRI(NLIG)= GROPRI
    Call CLCNETPRI([M]QTY(NLIG), [M]CUR, NLIG) From TRTVENPRI
    Call CLCPFM([M]DSTOFCY(NLIG), [M]PRITYP, [M]CHGTYP, [M]ORDDAT, [M]CUR, NLIG, INICPRPRI) From TRTVENPRI
    
    # 89275 : Duplication cde et ctrl des prix
    # Avec chgmnt de client
    # --> Ctrl prix net
    Raz GNETMAR
    If GREP= "D" & WZONCOU= "BPCORD" & GDACLOK=1
        GNETMAR=1
        Call CTLNETPRI([M:SOH0]BPCORD, [M]CHGTYP, [M]ORDDAT, [M:SOH0]CUR,NLIG) From TRTVENPRI
        Raz GNETMAR : Raz GMESSAGE
    Endif
    # --> Recalcul des totaux avec ctrl de la marge
    Gosub RECALC_TOT
    #Call APRES_LIGNE(NLIG, 0)
    # 89275
    
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    If [M:SOH4]DINVCND(NLIG)<>"" and [M:SOH4]DINVCNDTOUPD(NLIG)=[V]CST_AYES
      NOL=NLIG
      Gosub P1_NBLIG_DINVCND_UPD From LIBSAL_INVCND_SOH
      If mkstat=2 : Return : Endif
    Endif
    # End issue 107888
    
    ORI = NLIG
    # Traitement des gratuits
    Gosub TRTGRA
    Return
    
    #--------------------------------------------------------------------------------------#
    # Traitement des gratuits                                                              #
    #--------------------------------------------------------------------------------------#
    # ACT = "S" : Suppression  gratuit précédente recherche                                #
    # ACT = "C" : Remplacement gratuit précédente recherche par gratuit nouvelle recherche #
    # ACT = "I" : Insertion    gratuit nouvelle recherche                                  #
    #--------------------------------------------------------------------------------------#
    $TRTGRA
    Local Integer LIGGRA
    Local Integer RET
    
    # Suppression ou remplacement
    If ACT = "S" | ACT = "C"
        LIGGRA = find(3, [M]FOCFLG(NLIG+1..[M]NBLIG-1))
        If LIGGRA <> 0
            LIGGRA = LIGGRA + NLIG
    #       Suppression du gratuit
            If ACT = "S"
                Call SUPGRA(ORI, 2, RET) From TRTVENBOM
                If RET = 0 [M]FOCFLG(ORI)=1 : Endif
            Endif
    #       Remplacement du gratuit
    #       --> L'article est différent : Suppression et création
            If ACT = "C" & [M]ITMREF(LIGGRA) <> GFOCITMREF
                Call SUPGRA(LIGGRA-1, 2, RET) From TRTVENBOM
                If RET = 0
                    Call CREGRA("G",0, ORI, [M:SOH0]ORDDAT, 2, LIGGRA, RET) From TRTVENBOM
                    If RET = 0 [M]UPDFLG(LIGGRA-1) = 1:Endif
                Endif
    #       Remplacement du gratuit
    #       --> L'article est identique : Modification de la qté
            Elsif ACT = "C" & [M]QTY(LIGGRA) <> GFOCQTY
                [M]QTY(LIGGRA) = GFOCQTY
                [M]UPDFLG(LIGGRA) = 1
                If GREV=2 [M]LINREVNUM(LIGGRA) = [M:SOH0]REVNUM:Endif
            Endif
        Endif
    Endif
    # Insertion
    If ACT = "I"
        LIGGRA = NLIG + 1
        While LIGGRA < [M:SOH4]NBLIG & !find([M:SOH4]LINTYP(LIGGRA),1,2,6,10)
            LIGGRA += 1
        Wend
        Call CREGRA("G", 0, ORI, [M:SOH0]ORDDAT, 2, LIGGRA, RET) From TRTVENBOM
        # Issue 107888 - 2016-09-09 by CPO : US150 Free products not deliverable invoicing
        #TODO 107888 US150 içi, création échéancier
    
    Endif
    Raz ACT
    Return
    
    #-----------------------------------------------------------------------#
    #     Traitement de l'article de remplacement                           #
    #-----------------------------------------------------------------------#
    #---------------------------------------------------#
    #     Utilisée avec Action de modélisée SPRLITM     #
    #---------------------------------------------------#
    $TRT_RPLITM
    
    Local Char    WSAU(GLONUOM), UNIVEN
    Local Char    REP, SECTION
    Local Integer RET
    Local Integer I
    
    # --------------------------------------------------- #
    # Penser à mettre en phase avec C_ITMREF et AM_ITMREF #
    # --------------------------------------------------- #
    
    If [F:ITS]ITMREF <> WITM
        Read [ITS]ITS0=WITM
        If fstat mkstat=2 : GERR=1 : Return : Endif
    Endif
    Raz [M]PCK(NOL)
    Raz [M]LOT(NOL)
    Raz [M]LOC(NOL)
    WSAU = [M]SAU(NOL)
    [M]LINTYP(NOL) = 1
    If [F:ITS]ITMTYP = 2 [M]LINTYP(NOL) = 6 :Endif
    If [F:ITS]ITMTYP = 3 [M]LINTYP(NOL) = 2 :Endif
    
    # --> Etape n°1 : Remplacement par article de substitution
    Call CTLSBSITM(WITM, [M:SOH0]ORDDAT, RET) From TRTVENCTL
    If RET = 1
        GMESSAGE = mess(40,192,1) : GERR=1 : mkstat=2: Return
    Elsif RET = 2
        GMESSAGE = mess(10,191,1) : GERR=2
        WITM = [F:ITS]ITMREF
    Endif
    # --> Etape n°2 : Lecture article
    If [F:ITM]ITMREF <> WITM
        Read [ITM]ITM0=WITM
        If fstat GMESSAGE = mess(8,192,1) : mkstat=2 : GERR=1 : Return : Endif
    Endif
    # --> Etape n°3 : Ctrl du statut de l'article : Ctrl statut non utilisable
    #     Les autres statuts dépendent du code FMI
    If [F:ITM]ITMSTA = 6
       GMESSAGE = mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")"
       mkstat=2 : GERR=1 : Return
    Endif
    # On vérifie que la date de commande est bien >= la date de début de vie de l'article
    If [F:ITM]LIFSTRDAT<>[0/0/0] & [M:SOH0]ORDDAT<[F:ITM]LIFSTRDAT
       mkstat=2 : GERR=1 : GMESSAGE=mess(331,199,1)-":"-format$(GFMDAT,[F:ITM]LIFSTRDAT) : Return
    Endif
    # On vérifie que l'article est toujours vendu
    If clalev([F:ITG])= 0 Local File ITMCATEG [ITG] : Endif
    If [F:ITG]TCLCOD <> [F:ITM]TCLCOD
        Read [ITG]ITG1=[F:ITM]TCLCOD;""
        If fstat GMESSAGE = [F:ITM]TCLCOD-":"-mess(338,199,1) : mkstat=2 : End : Endif
    Endif
    If [F:ITG]SALFLG<>2 GMESSAGE = mess(221,199,1)-"("-[F:ITM]TCLCOD-")" : mkstat=2 : End : Endif
    
    # --> Etape n°4 : Controle de l'unite
    Call CONTSAUIMP(WSAU, WITM,[M]BPCORD,UNIVEN) From TRTVENCTL
    If UNIVEN = "" GMESSAGE = mess(9,192,1) : mkstat=2 : GERR=1 : Return : Endif
    
    # --> Etape n°5 : Recherche interdit
    If dim([M]REP1(NOL)) > 0 REP = [M]REP1(NOL):Endif
    Call RECH_INTERDIT (WITM, [M]DBPAADD(NOL), REP, 2) From TRTVENTAR
    If mkstat = 2 : GERR=1 : Return : Endif
    
    # --> Etape n°6 : Si cde de prêt, l'article doit etre géré en pret
    If [M:SOH0]SOHCAT = 2 & [F:ITS]LNDFLG = 1
        GMESSAGE=mess(34,192,1) : GERR=1 : mkstat=2 : Return
    Endif
    # --> Etape n°6 : Si cde de prêt et article géré en stock, il doit être géré en emplacement
    If [M:SOH0]SOHCAT = 2 & [F:ITM]STOMGTCOD <> 1
        If [F:ITF]ITMREF <> WITM | [F:ITF]STOFCY <> [M]DSTOFCY(NOL)
            Read [ITF] ITF0=WITM;[M]DSTOFCY(NOL)
            If fstat Raz [F:ITF] : Endif
        Endif
        If [F:ITF]LOCMGTCOD <> 2
            GMESSAGE = mess(119,192,1) : GERR=1 : mkstat=2 : Return
        Endif
    Endif
    # --> Etape n°7 : Si cde à facturation directe inter-site, l'article ne doit pas être réceptionné
    # Issue 113089/130 - 2016-10-14 by SR : Message 269,194 remplacé par 578,194
    If [M:SOH0]SOHCAT=3 & [M:SOH1]BETFCY=2
        If [F:ITM]RCPFLG=2 GMESSAGE=mess(578,194,1) : GERR=1 : mkstat=2 : Return : Endif
    Endif
    # --> Etape n°8 : Réinitialiser les zones venant de l'article
    Call INIT_ITM (NOL, WITM)
    
    # --> Etape n°9 :     Gestion du FMI
    Local Integer WFMI, WOK : WOK=1
    Call ALIFMI(WITM, [M:SOH4]DSTOFCY(NOL), WFMI) From TRTVENCDE
    Case WFMI
        When 1 : # Stock
            If [F:ITM]ITMSTA>1
                Call AVERTIR (WITM-mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")", WOK) From GESECRAN
                If WOK=1 GERR=1 : mkstat=2 : Return Endif
            Endif
        When 3 : # Contremarque achat
            If [F:ITM]ITMSTA=3
                Call AVERTIR (WITM-mess(281,197,1)-":\"-mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")", WOK) From GESECRAN
                If WOK=1 GERR=1 : mkstat=2 : Return Endif
            Elsif [F:ITM]ITMSTA>1
                GMESSAGE=WITM-mess(281,197,1)-":\"-mess(3,196,1)+" ("+mess([F:ITM]ITMSTA,246,1)+")" : GERR=1 : mkstat=2 : Return
            Endif
        When 5 : # Contremarque production
            Call CONTMFGITM([M]DSTOFCY(NOL), 1) From MFGLIB : If mkstat=2 GERR=1 : Return Endif
    Endcase
    
    [M]ITMREF(NOL) = WITM
    # On conserve l'unite de l'article d'origine
    If [M]SAU(NOL) <> WSAU
    #    Call ALISAUCOE(WITM, [M]BPCORD, WSAU, [M]STU(NOL), [M]SAUSTUCOE(NOL)) From TRTVENQTE
        Call CTLUOM([M]ITMREF(NOL), 2, [M]BPCORD, WSAU, [M]SAUSTUCOE(NOL), GBIDC1, GBIDC2, [M]DACSAUCOE(NOL)) From STKACT
        If mkstat=2 GERR=1 : Return : Endif
        [M]SAU(NOL) = WSAU
    Endif
    # --- Réinitialisation
    # A cause de l'INISEC "SOP" qui peut être paramétré avec [F:POP]
    If GMODU(6)=2 & GNBDIE>0 Raz [F:POP] : Endif
    For I = 1 To GNBDIE
        If evalue("dim([M]CCE"+num$(I)+"(NOL))") >0
            Call INISEC(SECTION, "SOP", I) From TRTX3CPT
            Assign "[M]CCE"+num$(I)+"(NOL)" With SECTION
        Endif
    Next
    [M:SOH4]FMI(NOL)=WFMI
    
    If find([M]FMI(NOL),3,5) [M]DALLTYP(NOL)=2 Endif
    
    # 105605 : CCM - Revision index (LD:29/07/15)
    # Init versions for the alternate product
    If dim([M:SOH4]ECCVALMAJ) > 0
        Raz [M:SOH4]ECCVALMAJ(NOL)
        Raz [M:SOH4]ECCVALMIN(NOL)
        If WFLDNAM = "QTY"
            Call STKINIECC([M:SOH4]ITMREF(NOL),"","SOH4",1,2,NOL,2,[M:SOH4]ECCVALMAJ(NOL),"ECCVALMAJ","ECCVALMIN","","",2,[M:SOH0]BPCORD) From STKACT
            # 110640
            # Issue 110640
            Call INIECCSTA([M:SOH4]ITMREF(NOL), "SOH4",NOL) From STKECR
            # End issue 110640
        Endif
    Endif
    # 105605 : CCM - Revision index (LD:29/07/15)
    
    If WFLDNAM = "ITMREF" & [M:SOH4]QTY(NOL) <> 0 | WFLDNAM = "QTY"
        If WFLDNAM = "ITMREF"
        # ------------------------------------------ #
        # Traitement propre sur la référence article #
        # ------------------------------------------ #
        #   Si la quantité a déjà été saisie on refait le traitement apres_modif qté
        #   Sinon tout sera fait à la saisie de la quantité
    #       --- Controle article-site
            Call CONTITF([M:SOH4]ITMREF(NOL),[M:SOH4]DSTOFCY(NOL),[M:SOH4]STOMGTCOD(nolign-1)) From TRTVENCTL
            If mkstat = 2 GERR=1 : Return : Endif
    #       --- Ctrls qté et nouvelle recherche tarif
            Call CNVQTY([M]QTY(NOL),[M]SAUSTUCOE(NOL),[M]STU(NOL),[M]QTYSTU(NOL)) From TRTVENQTE
        Endif
    
    #   --- Calcul des montants de base de calcul de la taxe
        Call ALICLCAMT([M:SOH4]ITMREF(NOL), [M:SOH4]QTY(NOL), NOL, "SOH4", [M:SOH4]CLCAMT1(NOL), [M:SOH4]CLCAMT2(NOL)) From TRTX3
    
        If WFLDNAM = "ITMREF"
    #       --- Nouvelle recherche tarif
            Call RECH_TARIF(1,[M]ITMREF(NOL),NOL,[M]QTY(NOL),"SOH",[M]GROPRI(NOL)) From TRTVENTAR
        Endif
    
        # Sauvegarde de gmessage car raz
        Local Char SAVMSG(255) : SAVMSG=GMESSAGE : # ACA - 48862
    
    #   --- Calcul du prix net
        Call CLCNETPRI([M]QTY(NOL),[M:SOH0]CUR, NOL) From TRTVENPRI
        If GDACLOK=1
            Call CTLNETPRI([M:SOH0]BPCORD, [M]CHGTYP, [M]ORDDAT, [M:SOH0]CUR,NOL) From TRTVENPRI
            If mkstat=2 Return Endif
        Endif
    #   --- Calcul de la marge
        Call CLCPFM([M]DSTOFCY(NOL), [M:SOH1]PRITYP, [M]CHGTYP, [M:SOH0]ORDDAT, [M:SOH0]CUR, NOL,2) From TRTVENPRI
        If GDACLOK=1
            Call CTLPFM([M:SOH0]CUR,[M:SOH4]CPRPRI(NOL), NOL) From TRTVENPRI
            If mkstat=2 Return Endif
        Endif
    
        GMESSAGE=SAVMSG : # ACA - 48862
    
        If WFLDNAM = "ITMREF" & find([M]LINTYP(NOL),1,2,6,10)
            If [M]FOCFLG(NOL) <> 3 & [M]GROPRI(NOL) =0
              If !([M:SOH1]BETFCY = 2 & [M:SOH1]BETCPY <> 2) or GCTLBETFCY = 2 Then          # FGR 10/03/2015 : X3SUIVI23273 - Si pas (Intersit & non intersoc) ou si Ctrl intersit encours&prix
                GERR = 3
                GMESSAGE = mess(62,194,1)
              Endif
            Endif
        Endif
    Endif
    
    
    Local Integer WRETOUR
    Local Char    WNUMTEX (12)
    
    # récupération du texte de l'article
    If find(GSALTEXLIN, 1,5)
        If ([F:ITU]ITMREF<>[M:SOH4]ITMREF (NOL)) | ([F:ITU]BPCNUM<>[M:SOH0]BPCORD)
            Read [F:ITU]ITU0 = [M:SOH4]ITMREF (NOL);[M:SOH0]BPCORD
            If fstat  Raz [F:ITU] : Endif
        Endif
        If [F:ITU]ITSTEX = ""
            If [F:ITS]ITMREF <> [M:SOH4]ITMREF (NOL)
                Read [F:ITS]ITS0 = [M:SOH4]ITMREF (NOL)
                If fstat  Raz [F:ITS] : Endif
            Endif
    #        WNUMTEX = [F:ITS]ITSTEX
            [M:SOH4]SOQTEX(NOL) = [F:ITS]ITSTEX
        Else
    #        WNUMTEX = [F:ITU]ITSTEX
            [M:SOH4]SOQTEX(NOL) = [F:ITU]ITSTEX
        Endif
    #    If WNUMTEX <> ""
    #        WRETOUR = 0
    #        Call TEX(5,"SOQ1","","","",WNUMTEX,"X",WRETOUR) From TRTX3TEX
    #        If WRETOUR <> 99
    #            [M:SOH4]SOQTEX (NOL) = WNUMTEX
    #        Endif
    #    Endif
    Endif
    
    Return
    ###########################################################################
    # Traitements appelés par SUBSOHA                                         #
    ###########################################################################
    #------------------------------------------#
    # Recalcul des lignes suite à tarif groupé #
    #------------------------------------------#
    $RECALC_GROUPE
    Local Integer I
    
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    Local Integer WSAVE_NOL,IS_RECALC_GROUP
    IS_RECALC_GROUP = [V]CST_AYES
    WSAVE_NOL=-1
    If dim(NOL)<0
      Local Integer NOL
    Else
      WSAVE_NOL = NOL
    Endif
    # End issue 107888
    
    # --> Recalcul prix net, marge des lignes modifiées et recalcul totaux
    If sum([M:SOH4]GRPFLG) <> 0
        For I=0 To [M]NBLIG-1
            If [M:SOH4]GRPFLG(I) = 1
               # X3-85542 : Apply a grouping price list equal to zero on an invoicing element - Sales orders/Sales quotes : (LD:04/27/18)
               # (Bug story for Issue X3-59918)
               # Simulation Netpri calcul to see if it is necessary to trigger all the calculs for the line
               # (Calculs trigger calculs of invoicing elts with transfer rules)
               Local Decimal  WNETPRI
               # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
               Local Decimal  WQTY : WQTY=[M:SOH4]QTY(I)
               # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
               Gosub SIMUL_NETPRI
               # Issue X3-38233 - 2019-03-19 by SR : If GERR = 2
               If GERR = 2 : Gosub NETPRI_AFF_MESS : Endif
               If [M:SOH4]NETPRI(I)<>WNETPRI
               # Netpri has been changed by the group price search : recalculs for the line
               # X3-85542 : Apply a grouping price list equal to zero on an invoicing element - Sales orders/Sales quotes : (LD:04/27/18)
                    Call SUB_TOT(I)
                    GNETMAR = 0
                    Call CLCNETPRI([M]QTY(I), [M:SOH0]CUR, I) From TRTVENPRI
                    # Issue X3-38233 - 2019-03-19 by SR : If GERR = 2
                    If GERR = 2 : Gosub NETPRI_AFF_MESS : Endif
                    Call CLCPFM([M]DSTOFCY(I), [M:SOH1]PRITYP, [M]CHGTYP, [M:SOH0]ORDDAT, [M:SOH0]CUR, I, 0) From TRTVENPRI
                    Call APRES_LIGNE(I,0)
                    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
                    If [M:SOH4]DINVCND(I)<>"" and [M:SOH4]DINVCNDTOUPD(I)=[V]CST_AYES
                      NOL=I
                      Gosub P1_NBLIG_DINVCND_UPD From LIBSAL_INVCND_SOH
                      If mkstat=2
                        GERR=1 : OK=0 : Break
                      Endif
                    Endif
                    # End issue 107888
                    GNETMAR = 1
                    [M:SOH4]UPDFLG(I) = 1
                    If GREV=2 [M]LINREVNUM(NOL)=[M:SOH0]REVNUM Endif
               # X3-85542 : Apply a grouping price list equal to zero on an invoicing element - Sales orders/Sales quotes : (LD:04/27/18)
               Endif
               # X3-85542 : Apply a grouping price list equal to zero on an invoicing element - Sales orders/Sales quotes : (LD:04/27/18)
            Endif
        Next
        Raz [M:SOH4]GRPFLG
    Endif
    
    # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
    IS_RECALC_GROUP = [V]CST_ANO
    If WSAVE_NOL>-1 : NOL = WSAVE_NOL : Endif
    # End issue 107888
    
    Return
    
    #-------------------------------------------------------------------------#
    # Issue X3-38233 - 2019-03-19 by SR :  GERR may be broken by lines below
    # so the error is sent at this time and GERR/GEMSSAGE razed
    $NETPRI_AFF_MESS
    If  GMESSAGE <> ""
        GMESSAGE -= mess(18,197,1)-":"-  num$(I+1)
        Call MESSAGE(GMESSAGE) From GESECRAN
        Raz GMESSAGE
    Endif
    Raz GERR
    Return
    # End issue X3-38233
    
    # Issue X3-59918
    #------------------------------------------#
    # Simulation netpri calcul                 #
    #------------------------------------------#
    $SIMUL_NETPRI
    Local Decimal  WMAJREM(0..8)
    Local Shortint WJ
    
    For WJ=1 To 9
        If evalue("dim([M:SOH4]DISCRGVAL"+num$(WJ)+"(I))")>0
           WMAJREM(WJ-1)=evalue("[M:SOH4]DISCRGVAL"+num$(WJ)+"(I)")
        Endif
    Next WJ
    If [M:SOH4]FOCFLG(I) = 3 Return Endif
    
    # --> Calcul du prix net
    If dim(GCALNETLIN)>0 : GCALNETLIN=I+1      : Endif
    If dim(GCALNETABR)>0 : GCALNETABR="[M:SOH4]"  : Endif
    # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
    #Call CALNET (1, [M:SOH0]PLISTC, [M:SOH4]GROPRI(I), WMAJREM, [M:SOH4]QTY(I), WNETPRI, [M:SOH1]CUR) From TRTPRICE
    Call CALNET (1, [M:SOH0]PLISTC, [M:SOH4]GROPRI(I), WMAJREM, WQTY, WNETPRI, [M:SOH1]CUR) From TRTPRICE
    # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
    
    Return
    # End issue X3-59918
    
    #--------------------------------------------------------------------#
    #     Bouton allocation                                              #
    #--------------------------------------------------------------------#
    #---------------------------------------------------#
    #     Utilisée avec Action de modélisée TRTORDALL   #
    #---------------------------------------------------#
    $TR_ALLOC
    Local Char    WTRTLIG(1), WMESS(80), WMESS1(80)  :    Raz WMESS1
    Local Integer OK
    Local Integer WKIT : # Bug 56680
    
    # Bug 84932 : Allocation ruptures à tord si alloc ligne normale après un kit
    Local Integer WWGENSHT : WWGENSHT=WGENSHT
    If GMODU(6)=2 & clalev([F:POQ])=0 : Local File PORDERQ [POQ] : Endif
    GOK=1
    Trbegin ADOVAL
        For I=0 To [M:SOH4]NBLIG-1
            nolign=I+1
            OK=2
            WMESS = mess(80,197,1)+" "+[M:SOH4]ITMREF(I)
    # Trt si statut ferme
            If [M:SOH4]DEMSTA(I) <> 1 WMESS1=mess(279,197,1):OK = 1: Endif
    # Pas d'allocation des articles gérés en contremarque
    # Pas d'allocation des articles géré avec un ordre de production
            If WTRTALL = 1 & [M:SOH4]FMI(I) = 3 WMESS1=mess(281,197,1) : OK = 1 : Endif
            If WTRTALL = 1 & [M:SOH4]FMI(I) = 5 WMESS1=mess(280,197,1) : OK = 1 : Endif
    # Désallocation des articles gérés en contremarque
            If WTRTALL = 2 & WALLCTM = 1 & [M:SOH4]FMI(I) = 3 WMESS1=mess(281,197,1) : OK = 1 : Endif
            If WTRTALL = 2 & WALLCTM = 1 & [M:SOH4]FMI(I) = 5 WMESS1=mess(280,197,1) : OK = 1 : Endif
    # Trt si article non soldé
            If [M:SOH4]SOQSTA(I)  = 3 WMESS1=mess(282,197,1) : OK = 1 : Endif
    # Trt si article géré en stock (sf pour les composés de kit/sous-traité et ses composants)
            If [M:SOH4]STOMGTCOD(I)=1 & find([M:SOH4]LINTYP(I),1,6,7,8,9)
                If [M:SOH4]FMI(I) = 2 WMESS1=mess(281,197,1)
                Else                  WMESS1=mess(283,197,1) : Endif
                OK = 1
            Endif
            # Bug 72631 : Pb failure to allocate kit component lines when kit header is allocated
            ## Bug 56680 : Pb kit géré en ctm
            ## Si un kit n'est pas à allouer, les composants ne sont pas à allouer
            #If !find([M]LINTYP(I),3,4,5)
            #    Raz WKIT
            #Elsif [M]LINTYP(I)=2
            #    WKIT=I
            #Elsif find([M]FMI(WKIT),3,5)
            #    OK=1
            #Endif
            If [M]LINTYP(I)=2
                WKIT=I
            Elsif !find([M]LINTYP(I),3,4,5)
                Raz WKIT
            Elsif find([M]FMI(WKIT),3,5)
                OK=1
            Endif
            # Bug 72631
            #---------------------------------------------------------------------#
            # Point d'entree contrôle autorisation lignes à allouer               #
            #---------------------------------------------------------------------#
            GPOINT="SOHALLSEL" : Gosub ENTREE From EXEFNC
            If OK = 1
                Call ECR_TRACE(WMESS,0) From GESECRAN
                If WTRTALL=1 Call ECR_TRACE(WMESS1+":"+mess(278,197,1),0) From GESECRAN : Endif
                If WTRTALL=2 Call ECR_TRACE(WMESS1+":"+mess(526,197,1),0) From GESECRAN : Endif
                Goto NXTLIG
            Endif
    # Allocation si tout n'est pas alloué
            If WTRTALL = 1 & WSHTFLG = 1
                If [M:SOH4]TALLQTYSTU(I) >= [M:SOH4]QTYSTU(I) & [M:SOH4]SHTQTYSTU(I) = 0 Goto NXTLIG : Endif
            Endif
    # Allocation des ruptures s'il y a des ruptures
            If WTRTALL = 1 & WSHTFLG = 2 & [M:SOH4]SHTQTYSTU(I) = 0 Goto NXTLIG : Endif
            If WTRTALL = 1
    # ------ Allocation -------------------------------------------------
                WALLSTU = 0
                WSHTSTU = [M:SOH4]SHTQTYSTU(I)
    #           Calcul de la qté à allouer
                If WSHTFLG = 1 | (find([M:SOH2]DME, 2,3) & WALLPAR = 1)
                    If [M:SOH4]TALLQTYSTU(I) + WSHTSTU < [M:SOH4]QTYSTU(I)
                        WALLSTU = [M:SOH4]QTYSTU(I) - ([M:SOH4]TALLQTYSTU(I) + WSHTSTU)
                    Endif
                Endif
                #---------------------------------------------------------------------#
                # Point d'entree modification de la quantité à allouer                #
                #---------------------------------------------------------------------#
                GPOINT="MODQTEALL" : Gosub ENTREE From EXEFNC
                If GOK=0 Goto AB_ALLOC : Return Endif
            Else
    # ------ Desallocation -------------------------------------------------
                WALLSTU = [M:SOH4]ALLQTYSTU(I)
                WSHTSTU = [M:SOH4]SHTQTYSTU(I)
            Endif
            If WALLSTU + WSHTSTU <> 0
               Readlock [SOQ] SOQ0 = [M:SOH0]SOHNUM;[M:SOH4]SOPLIN(I);[M:SOH4]SOPLIN(I)
               If fstat=1
                   GOK=-1
                   GLOCK="$SORDERQ"-[M]SOHNUM-num$([M:SOH4]SOPLIN(I))-num$([M:SOH4]SOPLIN(I))
                   Goto ROLL_ALLOC
               Elsif fstat
                   GOK=0
                   Call RSTA("SOQ",[M]SOHNUM+num$([M]SOPLIN(I))+num$([M]SOPLIN(I))) From GLOCK
                   Goto AB_ALLOC
               Endif
               Read     [SOP] SOP0 = [M:SOH0]SOHNUM;[M:SOH4]SOPLIN(I);[M:SOH4]SOPLIN(I)
               If fstat
                   GOK=0 :
                   Call RSTA("SOP",[M]SOHNUM+num$([M]SOPLIN(I))+num$([M]SOPLIN(I))) From GLOCK
                   Goto AB_ALLOC
               Endif
               If WTRTALL = 2 WTRTLIG = "A"
               Elsif [F:SOQ]ALLQTYSTU = 0 & [F:SOQ]SHTQTYSTU = 0 WTRTLIG = "C"
               Else WTRTLIG="M" : Endif
    
               If [M:SOH4]STOMGTCOD(I) <> 1
    #               Génération des ruptures
    #               On génère toujours les ruptures sur un kit/sous-traité et ses composants (sinon déphasage possible)
                    WGENSHT=WWGENSHT   : # Bug 84932 : Allocation ruptures à tord si alloc ligne normale après un kit
                    If find([M:SOH4]LINTYP(I),2,3,4,5,10,11,12,13) WGENSHT=2 Endif
    #               Allocations partielles sf si livraison ligne/cde complète
    #               Un kit/sous-traité et ses composants ne peuvent être alloués partiellement (sinon déphasage possible)
                    If WALLPAR=1 & find([M:SOH2]DME,2,3) & !find([M:SOH4]LINTYP(I),2,3,4,5,10,11,12,13) WALLPAR=1
                    Else WALLPAR=0 : Endif
                    Call GENALLORD("","",WTRTLIG, WIMPCLI, WGENSHT, WALLPAR, WALLSTU, WSHTSTU, WRET) From TRTVENALL
                    If WRET <> 0
                        Call ECR_TRACE(WMESS,0) From GESECRAN
                        If WRET=2 & GOK=1
                                  Call ECR_TRACE(mess(504,197,1)-"\"-mess(44,192,1),0) From GESECRAN
                                  #--- Bug 55688 puis Bug 55688 suite
                                  # Une suppression des ruptures a été faite avant la tentative d'allocations
                                  # --> il faut raz la quantité rupture de la ligne de commande
                                  #If WTRTLIG<>"A" & WSHTSTU<>0
                                  #   [F:SOQ]SHTQTY     = 0
                                  #   [F:SOQ]SHTQTYSTU  = 0
                                  #   Rewrite [SOQ]
                                  #   If fstat GOK=0 : Call FSTA("SOQ") From GLOCK : Goto AB_ALLOC : endif
                                  #   [M:SOH4]SHTQTY(I)    = [F:SOQ]SHTQTY
                                  #   [M:SOH4]SHTQTYSTU(I) = [F:SOQ]SHTQTYSTU
                                  #   # --- Qté à allouer = Qté déjà allouée
                                  #   [M]WALLQTY(I)        = [F:SOQ]ALLQTY + [F:SOQ]SHTQTY
                                  #   [M]WALLQTYSTU(I)     = [F:SOQ]ALLQTYSTU + [F:SOQ]SHTQTYSTU
                                  #   [M]YSHTQTY(I)        = [M]SHTQTY(I)
                                  #Endif
                                  #--- Fin bug 55688
                                  If WTRTLIG<>"A" & WSHTSTU<>0
                                     Local Integer WRUPTYP
                                     If [M:SOH4]DALLTYP(I)=1
                                        WRUPTYP=5
                                     Else
                                        WRUPTYP=4
                                     Endif
                                     # FGR 29/04/2015 : X3SUIVI105605 (début)
                                     # Recréation de l'allocation de rupture qui a été supprimée
    #                                 Call CREALL(WRUPTYP,[F:SOQ]STOFCY,[F:SOQ]ITMREF,0,[31/12/2999],
    #&                                            0,WSHTSTU,2,[F:SOQ]SOHNUM,[F:SOQ]SOPLIN,[F:SOQ]SOQSEQ,
    #&                                            "",max(date$,[F:SOQ]SHIDAT),[F:SOQ]LOT,"","",
    #&                                            [F:SOQ]LOC,"","",0,0,"","","","",1,WRET) From STKALL
                                     #--- TS 106217 ajout paramètre LECC (avant dernier)
                                     # Recréation de l'allocation de rupture qui a été supprimée
    #                                 Call CREALL(WRUPTYP,[F:SOQ]STOFCY,[F:SOQ]ITMREF,0,[31/12/2999],
    #&                                            0,WSHTSTU,2,[F:SOQ]SOHNUM,[F:SOQ]SOPLIN,[F:SOQ]SOQSEQ,
    #&                                            "",max(date$,[F:SOQ]SHIDAT),[F:SOQ]LOT,"","",
    #&                                            [F:SOQ]LOC,"","",0,0,"","","","",1,"",WRET) From STKALL
                                     Call CREALL(WRUPTYP,[F:SOQ]STOFCY,[F:SOQ]ITMREF,0,[31/12/2999],
    &                                            0,WSHTSTU,2,[F:SOQ]SOHNUM,[F:SOQ]SOPLIN,[F:SOQ]SOQSEQ,
    &                                            "",max(date$,[F:SOQ]SHIDAT),[F:SOQ]LOT,"","",
    &                                            [F:SOQ]LOC,"","",0,0,"","","","",1,[F:SOQ]ECCVALMAJ,WRET) From STKALL
                                     # FGR 29/04/2015 : X3SUIVI105605 (début)
                                  Endif
                                  #--- Fin bug 55688 suite
                                  Goto NXTLIG
                        Else
                                  Call ECR_TRACE(mess(96,197,1), 0) From GESECRAN
                                  Goto AB_ALLOC
                        Endif
                    Endif
               Endif
    
               WALL=WALLSTU*(1/[F:SOP]SAUSTUCOE)
               Call QTEARR(WALL, [F:SOP]SAU) From TRTDIV
               WSHT=WSHTSTU*(1/[F:SOP]SAUSTUCOE)
               Call QTEARR(WSHT, [F:SOP]SAU) From TRTDIV
    # -------- Réalimentation de la classe [F] ---
               If WTRTLIG = "A"
                   [F:SOQ]ALLQTYSTU -= WALLSTU
                   [F:SOQ]ALLQTY    -= WALL
    #              Annulation alloc.: Diminution de la qté rupture
                   [F:SOQ]SHTQTYSTU -= WSHTSTU
                   [F:SOQ]SHTQTY    -= WSHT
                   WALL *=-1
                   WSHT *=-1
               Else
                   [F:SOQ]ALLQTY    += WALL
                   [F:SOQ]ALLQTYSTU += WALLSTU
    #              Nouvelle alloc.  : Ecrasement avec la nouvelle qte rupture
                   [F:SOQ]SHTQTY     = WSHT
                   [F:SOQ]SHTQTYSTU  = WSHTSTU
               Endif
    
    # -------- Si desallocation d'une contremarque : il faut raz le n°contremarque
               ## GH 02/07/2014 bug 93888
               #If WRAZCTM=2 & ([M:SOH4]FMI(I) = 3 | [M:SOH4]FMI(I) = 5)
               #     Raz [F:SOQ]FMINUM, [F:SOQ]FMILIN, [F:SOQ]FMISEQ
               #Endif
               If WRAZCTM=2 & [F:SOQ]FMINUM<>""
                    Gosub RAZFMIMFG From SUBSOHA
                    Gosub RAZFMIPOH From SUBSOHA
                    Raz [F:SOQ]FMINUM, [F:SOQ]FMILIN, [F:SOQ]FMISEQ
               Endif
               ##
    
               Rewrite [SOQ]
               If fstat GOK=0 : Call FSTA("SOQ") From GLOCK : Goto AB_ALLOC : Endif
    
               # Point d'entrée mise à jour de la ligne de commande
               GPOINT="MAJSOQALL" : Gosub ENTREE From EXEFNC
               If GOK=0 Goto AB_ALLOC : Return Endif
    
               Call ECR_TRACE(WMESS,0) From GESECRAN
               WMESS1 = mess(106,197,1)+":"+format$("N:15F", WALL)-[F:SOP]SAU
               WMESS2 = mess(107,197,1)+":"+format$("N:15F", WSHT)-[F:SOP]SAU
               Call ECR_TRACE(sum(WMESS1, " ",WMESS2),0) From GESECRAN
    
    # -------- Mise à jour de l'encours
               If [M:SOH4]STOMGTCOD(I) <> 1
                    If [F:SOH]SOHCAT = 3
                        WCPLQTY = [F:SOQ]INVQTYSTU
                    Else
                        WCPLQTY = [F:SOQ]DLVQTYSTU
                    Endif
                    WTRTORD = "M" : Gosub APPELWIP From TRTVENMAJ
                    If GOK < 1 Goto AB_ALLOC Endif
    
                    # v6 affectations
                    #Gosub MAJ_MTO_SOQ From SALMTOLIB : # GH 02/07/14 bug 93888
                    If WRAZCTM=2
                        Gosub SUP_MTO_AV_SOQ From SALMTOLIB
                    Else
                        Gosub MAJ_MTO_SOQ From SALMTOLIB
                    Endif
               Endif
    
    # -------- Réalimentation de la classe [M] ---
               [M:SOH4]ALLQTY(I)     = [F:SOQ]ALLQTY
               [M:SOH4]ALLQTYSTU (I) = [F:SOQ]ALLQTYSTU
               [M:SOH4]TALLQTYSTU(I) = [F:SOQ]ALLQTYSTU+[F:SOQ]OPRQTYSTU+[F:SOQ]PREQTYSTU+[F:SOQ]ODLQTYSTU
               [M:SOH4]TALLQTY(I)    = [F:SOQ]ALLQTY+[F:SOQ]OPRQTY+[F:SOQ]PREQTY+[F:SOQ]ODLQTY
               # 107888 : Scheduled invoices : (LD:19/05/16)
               #If [M:SOH0]SOHCAT = 3
               If [M:SOH0]SOHCAT = 3 | ([M:SOH0]SOHCAT = 1 & [M:SOH4]DLVFLG(I)=1)
                   # --> Commande à facturation directe
                   # --> Commande normale et ligne non livrable
               # 107888 : Scheduled invoices : (LD:19/05/16)
                   [M:SOH4]TALLQTYSTU(I)  += [F:SOQ]INVQTYSTU
                   [M:SOH4]TALLQTY(I)     += [F:SOQ]INVQTY
               Else
                   # --> Commande normale/prêt et ligne livrable    : # 107888 : Scheduled invoices : (LD:19/05/16)
                   [M:SOH4]TALLQTYSTU(I) += [F:SOQ]DLVQTYSTU
                   [M:SOH4]TALLQTY(I)    += [F:SOQ]DLVQTY
               Endif
               # 107888 : Scheduled invoices : (LD:19/05/16)
               [M:SOH4]SHTQTY(I)     =  [F:SOQ]SHTQTY
               [M:SOH4]SHTQTYSTU(I)  = [F:SOQ]SHTQTYSTU
               # --- Qté à allouer = Qté déjà allouée
               [M:SOH4]WALLQTY(I)         = [F:SOQ]ALLQTY + [F:SOQ]SHTQTY
               [M:SOH4]WALLQTYSTU(I)      = [F:SOQ]ALLQTYSTU + [F:SOQ]SHTQTYSTU
               [M:SOH4]YALLQTY(I)         = [M:SOH4]ALLQTY(I)
               [M:SOH4]YSHTQTY(I)         = [M:SOH4]SHTQTY(I)
            Endif
            $NXTLIG
        Next
    
        Gosub MAJSTASOH
        #---------------------------------------------------------------------#
        #    Point d'entree mise à jour de la commande                        #
        #---------------------------------------------------------------------#
        GPOINT="MAJCDEALL" : Gosub ENTREE From EXEFNC
        If GOK=0 Goto AB_ALLOC : Return Endif
    
    Commit
    
    Return
    
    
    $ROLL_ALLOC
    Rollback : Call ROLL From GLOCK
    If GROLL
          Call ECR_TRACE(mess(17,107,1),1) From GESECRAN
    #      Gosub RELIT From GOBJSUB
    Else  Goto TR_ALLOC : Endif
    FIN=1
    
    Return
    
    $AB_ALLOC
    
    Rollback
    Call ECR_TRACE(mess(17,107,1),1) From GESECRAN
    #Gosub RELIT From GOBJSUB
    FIN=1
    
    Return
    
    #-----------------------------------------------------------------------#
    # Recalcul des statuts de la commande                                   #
    # -----------------------------------                                   #
    # Attention :                                                           #
    #    Utilisation de la classe F car tout n'est pas ds l'écran           #
    #                                                                       #
    # Appelé depuis LIENS,CREATION,MODIF                                    #
    #-----------------------------------------------------------------------#
    $MAJSTASOH
    Local Integer I, WAALLLINNBR, WALLLINNBR, WLINNBR, WDLVLINNBR, WINVLINNBR
    Local Integer WALLSTA, WDLVSTA, WINVSTA
    Local Decimal WTOTQTY
    Local Integer WADLVLINNBR  : # Nombre de lignes livrables : # 107888 : Scheduled invoices : (LD:20/05/16)
    
    WALLSTA = 1
    WDLVSTA = 1
    WINVSTA = 1
    For I=0 To [M:SOH4]NBLIG-1
        If [M:SOH4]STOMGTCOD(I) <> 1 & sum([M:SOH4]ALLQTY(I), [M:SOH4]OPRQTY(I), [M:SOH4]PREQTY(I)) <> 0 WALLSTA = 2 : Endif
    
        # 107888 : Scheduled invoices : (LD:19/05/16)
    #    If [M:SOH0]SOHCAT = 3
    #        If [M:SOH4]DLVQTY(I) > 0 WDLVSTA = 2 : Endif
    #    Else
    #        If [M:SOH4]DLVQTY(I) > 0 | [M:SOH4]ODLQTY(I) > 0 WDLVSTA = 2 : Endif
    #    Endif
    #    If [M:SOH0]SOHCAT = 3
    #       If [M:SOH4]INVQTY(I) > 0 | [M:SOH4]ODLQTY(I) > 0 WINVSTA = 2 Endif
    #    Else
    #       If [M:SOH4]INVQTY(I) > 0 WINVSTA = 2 Endif
    #    Endif
        If [M:SOH0]SOHCAT=3 | ([M:SOH0]SOHCAT=1 & [M:SOH4]DLVFLG(I)=1)
            # --> Commande à facturation directe
            # --> Commande normale et ligne non livrable
            # Calcul du statut livré
            # Ce cas là ne devrait jamais arriver ...
            If [M:SOH4]DLVQTY(I) > 0 WDLVSTA = 2 : Endif
            # Calcul du statut facturé
            If [M:SOH4]INVQTY(I) > 0 | [M:SOH4]ODLQTY(I) > 0 WINVSTA = 2 Endif
        Else
            # --> Commande normale/prêt et ligne livrable
            # Calcul du statut livré
            If [M:SOH4]DLVQTY(I) > 0 | [M:SOH4]ODLQTY(I) > 0 WDLVSTA = 2 : Endif
            # Calcul du statut facturé
            If [M:SOH4]INVQTY(I) > 0 WINVSTA = 2 Endif
        Endif
        # 107888 : Scheduled invoices : (LD:19/05/16)
    
    #   --- Recalcul du nbre de lignes à allouer
    #       Pour les lignes gérées en stock (donc livrables) et non soldées
        If [M:SOH4]STOMGTCOD(I) <> 1 & [M:SOH4]SOQSTA(I) <> 3
            WLINNBR+=1
            WTOTQTY = sum([M:SOH4]ALLQTY(I),[M:SOH4]OPRQTY(I),[M:SOH4]PREQTY(I),[M:SOH4]ODLQTY(I))
            If [M:SOH0]SOHCAT = 3
                WTOTQTY += sum([M:SOH4]INVQTY(I))
            Else
                WTOTQTY += sum([M:SOH4]DLVQTY(I))
            Endif
    #       --- Tout n'est pas alloué : Incrémentation du nbre de lignes restant a allouer
            If WTOTQTY < [M:SOH4]QTY(I) | [M:SOH4]SHTQTY(I) <> 0
                WAALLLINNBR += 1
            Elsif WTOTQTY >= [M:SOH4]QTY(I) & [M:SOH4]SHTQTY(I) = 0
    #       --- Tout est alloué : Incrémentation du nbre de lignes allouées
                WALLLINNBR += 1
            Endif
        Endif
    
    #   --- Recalcul du nbre de lignes livrées
        # 107888 : Scheduled invoices : (LD:19/05/16)
    #    If [M:SOH0]SOHCAT <> 3
    #        If [M:SOH4]DLVQTY(I) + [M:SOH4]ODLQTY(I) >= [M:SOH4]QTY(I)
    #            WDLVLINNBR += 1
    #        Endif
    #    Endif
        If [M:SOH0]SOHCAT <> 3 & [M:SOH4]DLVFLG(I)=2
            # --> Commande normale/prêt et ligne livrable
            # Calcul du nombre de lignes livrables
            WADLVLINNBR+=1
            # Calcul du nombre de lignes livrées
            If [M:SOH4]DLVQTY(I) + [M:SOH4]ODLQTY(I) >= [M:SOH4]QTY(I)
                WDLVLINNBR += 1
            Endif
        Endif
        # 107888 : Scheduled invoices : (LD:19/05/16)
    
    #   --- Recalcul du nbre de lignes facturées
        If [M:SOH4]INVFLG(I) = 2
            WINVLINNBR += 1
        Endif
    Next
    
    
    # Cde allouée ssi il y a des lignes gérées en stock et
    #                 le nbre lignes à allouer = 0 et la cde n'est pas soldée
    #If [M]ORDSTA <> 2 & sum([M:SOH4]STOMGTCOD) <> [M:SOH4]NBLIG
    #    If WAALLLINNBR = 0
    #        WALLSTA = 3
    #    Endif
    #Endif
    # Cde allouée ssi cde non soldée et les lignes gérées en stock et non soldées sont totalement allouées
    If [M:SOH1]ORDSTA <> 2 & WLINNBR<>0 & WALLLINNBR = WLINNBR WALLSTA = 3 : Endif
    
    # 107888 : Scheduled invoices : (LD:19/05/16)
    #If WDLVLINNBR >= [F:SOH]LINNBR WDLVSTA = 3 : Endif
    #If WINVLINNBR >= [F:SOH]LINNBR WINVSTA = 3 : Endif
    
    # Cde livrée  ssi toutes les lignes livrables sont livrées
    If WADLVLINNBR>0 & WDLVLINNBR >= WADLVLINNBR WDLVSTA = 3 : Endif
    # Cde facturée ssi toutes les lignes sont facturées
    If WINVLINNBR >= [F:SOH]LINNBR WINVSTA = 3 : Endif
    # 107888 : Scheduled invoices : (LD:19/05/16)
    
    If WALLSTA <> [F:SOH]ALLSTA | WAALLLINNBR <> [F:SOH]ALLLINNBR |
    &  WDLVSTA <> [F:SOH]DLVSTA | WDLVLINNBR <> [F:SOH]DLVLINNBR |
    &  WINVSTA <> [F:SOH]INVSTA | WINVLINNBR <> [F:SOH]INVLINNBR
        Readlock [SOH]SOH0=[M:SOH0]SOHNUM
        If !fstat
           Update [SOH] Where SOHNUM=[M:SOH0]SOHNUM With ALLSTA=WALLSTA, ALLLINNBR=WAALLLINNBR,
    &                                                    INVSTA=WINVSTA, DLVLINNBR=WDLVLINNBR,
    &                                                    DLVSTA=WDLVSTA, INVLINNBR=WINVLINNBR
           # --------------------------------------
           # FGR 25/06/2015 : X3SUIVI109125 (début)
           #If fstat GOK=0 : Call FSTA("SOH") From GLOCK : Endif
           If fstat
             GOK=0
             Call FSTA("SOH") From GLOCK
           Else
             [M:SOH0]ALLLINNBR = WAALLLINNBR
             [M:SOH1]ALLSTA = WALLSTA
             [M:SOH1]DLVSTA = WDLVSTA
             [M:SOH1]INVSTA = WINVSTA
           Endif
           # FGR 25/06/2015 : X3SUIVI109125 (fin)
           # --------------------------------------
        Endif
        #[M:SOH0]ALLLINNBR = WAALLLINNBR  # FGR 25/06/2015 : X3SUIVI109125
        #[M:SOH1]ALLSTA = WALLSTA         # FGR 25/06/2015 : X3SUIVI109125
        #[M:SOH1]DLVSTA = WDLVSTA         # FGR 25/06/2015 : X3SUIVI109125
        #[M:SOH1]INVSTA = WINVSTA         # FGR 25/06/2015 : X3SUIVI109125
    Endif
    
    If sum([M:SOH4]STOMGTCOD) = [M:SOH4]NBLIG
       Grizo [M:SOH1]ALLSTA
    Else
       Actzo [M:SOH1]ALLSTA
    Endif
    
    Return
    
    #--------------------------------------------------------------------#
    # Mise à jour de l'adresse                                           #
    #--------------------------------------------------------------------#
    $MAJADRESSE
    Call DEBTRANS From GLOCK
    $TR_ADR
    GOK=1
    Trbegin [SOH]
      Readlock [SOH] SOH0=[M]SOHNUM
      If fstat=1  GOK=-1 : GLOCK="$SORDER"-[M]SOHNUM             : Goto ROLL_ADR
      Elsif fstat GOK=0  : Call RSTA("SOH",[M]SOHNUM) From GLOCK : Goto AB_ADR : Endif
      If BOUT="H"
         [F:SOH]CNTNAM = [M:ADB1]CNTNAM
         If [M:ADB1]ADBFLG = 2 Gosub CHARGE_ADRBPC Endif
      Elsif BOUT = "J"
         [F:SOH]CNINAM    = [M:ADB3]CNTNAM
    #     If dim([M:ADB3]EECNUM)>0 [F:SOH]BPIEECNUM = [M:ADB3]EECNUM Endif
         If dim([M:SOH0]BPIEECNUM)>0 : [F:SOH]BPIEECNUM = [M:SOH0]BPIEECNUM : Endif #RMA #82772
         If [M:ADB3]ADBFLG = 2 Gosub CHARGE_ADRBPI Endif
      Else
         [F:SOH]CNDNAM = [M:ADB2]CNTNAM
         If [M:ADB2]ADBFLG = 2 Gosub CHARGE_ADRBPD Endif
      Endif
      Rewrite [SOH]
      If fstat GOK=0 : Call FSTA("SOH") From GLOCK : Goto AB_ADR : Endif
    Commit
    Gosub RELIT From GOBJSUB  # FGR 24/07/2014 : X3SUIVI100377
    Return
    
    $ROLL_ADR
    Rollback : Call ROLL From GLOCK
    #if GROLL Gosub RELIT From GOBJSUB
    #else     Goto TR_ADR : ENDIF
    If !GROLL Goto TR_ADR : Endif
    Return
    
    $AB_ADR
    Rollback
    #osub RELIT From GOBJSUB
    Return
    
    # -------------------------------------- #
    # Alimentation de l'adresse commande     #
    # -------------------------------------- #
    $CHARGE_ADRBPC
    [F:SOH]BPAORD       = [M:ADB1]BPAADD
    #If GACTSAD=2     : # Bug 67868
        [F:SOH]BPCNAM(0)    = [M:ADB1]BPRNAM(0)
        [F:SOH]BPCNAM(1)    = [M:ADB1]BPRNAM(1)
        [F:SOH]BPCADDLIG(0) = [M:ADB1]BPAADDLIG(0)
        [F:SOH]BPCADDLIG(1) = [M:ADB1]BPAADDLIG(1)
        [F:SOH]BPCADDLIG(2) = [M:ADB1]BPAADDLIG(2)
        [F:SOH]BPCPOSCOD    = [M:ADB1]POSCOD
        [F:SOH]BPCCTY       = [M:ADB1]CTY
        [F:SOH]BPCSAT       = [M:ADB1]SAT
        [F:SOH]BPCCRY       = [M:ADB1]CRY
        [F:SOH]BPCCRYNAM    = [M:ADB1]CRYNAM
    #Endif            : # Bug 67868
    Return
    # -------------------------------------- #
    # Alimentation de l'adresse facturation  #
    # -------------------------------------- #
    $CHARGE_ADRBPI
    [F:SOH]BPAINV       = [M:ADB3]BPAADD
    #If GACTSAD=2     : # Bug 67868
      [F:SOH]BPINAM(0)    = [M:ADB3]BPRNAM(0)
      [F:SOH]BPINAM(1)    = [M:ADB3]BPRNAM(1)
      [F:SOH]BPIADDLIG(0) = [M:ADB3]BPAADDLIG(0)
      [F:SOH]BPIADDLIG(1) = [M:ADB3]BPAADDLIG(1)
      [F:SOH]BPIADDLIG(2) = [M:ADB3]BPAADDLIG(2)
      [F:SOH]BPIPOSCOD    = [M:ADB3]POSCOD
      [F:SOH]BPICTY       = [M:ADB3]CTY
      [F:SOH]BPISAT       = [M:ADB3]SAT
      [F:SOH]BPICRY       = [M:ADB3]CRY
      [F:SOH]BPICRYNAM    = [M:ADB3]CRYNAM
      # Issue X3-159652 by VAVIL: Webservices: ECMSOH don't update the field EECNUMX
      If func AFNC.ACTIV("KPO")>0
        If [M:ADB3]EECNUMX <> "" : [F:SOH]BPIEECNUM = [M:ADB3]EECNUMX : Endif
      Endif
      # Issue X3-159652 end
    #Endif            : # Bug 67868
    Return
    # -------------------------------------- #
    # Alimentation de l'adresse livraison    #
    # -------------------------------------- #
    $CHARGE_ADRBPD
    #If GACTSAD=2     : # Bug 67868
        [F:SOH]BPDNAM(0)    = [M:ADB2]BPRNAM(0)
        [F:SOH]BPDNAM(1)    = [M:ADB2]BPRNAM(1)
        [F:SOH]BPDADDLIG(0) = [M:ADB2]BPAADDLIG(0)
        [F:SOH]BPDADDLIG(1) = [M:ADB2]BPAADDLIG(1)
        [F:SOH]BPDADDLIG(2) = [M:ADB2]BPAADDLIG(2)
        [F:SOH]BPDPOSCOD    = [M:ADB2]POSCOD
        [F:SOH]BPDCTY       = [M:ADB2]CTY
        [F:SOH]BPDSAT       = [M:ADB2]SAT
        [F:SOH]BPDCRY       = [M:ADB2]CRY
        [F:SOH]BPDCRYNAM    = [M:ADB2]CRYNAM
        If dim([M:ADB2]ADRVAL) > 0 : [F:SOH]ADRVAL = [M:ADB2]ADRVAL : Endif #LTA.n
    #Endif
    Return
    #########################################################################
    # Traitements communs                                                   #
    #########################################################################
    #--------------------------------------------------------------------#
    # Lecture de ts les fichiers utiles à une ligne                      #
    #--------------------------------------------------------------------#
    Subprog LECT_FIC(NLIG)
    Value Integer NLIG
    
    If [F:ITS]ITMREF <> [M:SOH4]ITMREF(NLIG)
         Read [F:ITS]ITS0 = [M:SOH4]ITMREF(NLIG)
         If fstat  Raz [F:ITS] : Endif
    Endif
    If [F:ITM]ITMREF <> [M:SOH4]ITMREF(NLIG)
         Read [F:ITM]ITM0 = [M:SOH4]ITMREF(NLIG)
         If fstat  Raz [F:ITM] : Endif
    Endif
    End
    #--------------------------------------------------------------------#
    # Initialisation des zones venant de l'entete commande               #
    #--------------------------------------------------------------------#
    Subprog INIT_SOH(NLIG, AFF)
    Value Integer NLIG
    Value Integer AFF
    Local Integer I
    Local Char    WREP(GLONREP)             # hcb v6
    
    [M:SOH4]DBPAADD(NLIG)         = [M:SOH1]BPAADD
    If dim([M:ADB2]CNTNAM)>0
        [M:SOH4]CNDNAM(NLIG)      = [M:ADB2]CNTNAM
    Endif
    [M:SOH4]DSTOFCY(NLIG)         = [M:SOH2]STOFCY
    [M:SOH4]DDLVPIO(NLIG)         = [M:SOH2]DLVPIO
    [M:SOH4]DDRN(NLIG)            = [M:SOH2]DRN
    [M:SOH4]DDAYLTI(NLIG)         = [M:SOH2]DAYLTI
    If GREP <> "C" & GREP <> "D" & date$ > [M:SOH2]SHIDAT
        [M:SOH4]DSHIDAT(NLIG) = date$
    # --> Initialisation de la date de livraison demandée
        Call CALC_DLVDAT([M:SOH4]DSHIDAT(NLIG), [M:SOH4]DDAYLTI(NLIG), [M:SOH4]DBPAADD(NLIG), [M:SOH0]BPCORD, 0,0,
    &                    [M:SOH4]DDEMDLVDAT(NLIG)) From TRTVENDAT
        If func AFNC.ACTIV("EDIX3")>0    [M:SOH4]MAXDLVDAT(NLIG)  = [M:SOH4]DDEMDLVDAT(NLIG): Endif #SAM 110881
    Else
        [M:SOH4]DDEMDLVDAT(NLIG) = [M:SOH2]DEMDLVDAT
        [M:SOH4]DSHIDAT(NLIG)    = [M:SOH2]SHIDAT
        If func AFNC.ACTIV("EDIX3")>0    [M:SOH4]MAXDLVDAT(NLIG)  = [M:SOH2]DEMDLVDAT: Endif  #SAM 110881
    Endif
    # --> Calcul de la date de livraison prevue
    Call CALC_DLVDAT([M:SOH4]DSHIDAT(NLIG), [M:SOH4]DDAYLTI(NLIG), [M:SOH4]DBPAADD(NLIG), [M:SOH0]BPCORD, 0,0,
    &                [M:SOH4]EXTDLVDAT(NLIG)) From TRTVENDAT
    Raz GMESSAGE
    # --> Alimentation des commissions représentants
    For I=0 To dim([M:SOH1]REP)-1
    
      WREP = evalue("[M:SOH1]REP("+num$(I)+")")
    
      Assign ("[M:SOH4]REP"+num$(I+1)+"(NLIG)") With WREP
    
      If WREP <> ""
            If [F:REP]REPNUM <> WREP
                Read [F:REP]REP0 = WREP
                If fstat Raz [F:REP] : Endif
            Endif
            If [F:BPC]BPCNUM <> [M:SOH0]BPCORD
                Read [F:BPC]BPC0 = [M:SOH0]BPCORD
                If fstat Raz [F:BPC] :Endif
            Endif
            If [F:BPC]COMCAT <> 0
                Assign ("[M:SOH4]REPRAT"+num$(I+1)+"(NLIG)") With evalue("[F:REP]COMRAT"+num$(I+1)+"([F:BPC]COMCAT-1)")
            Endif
      Endif
    
    Next
    
    [M:SOH4]DMDL(NLIG)            = [M:SOH2]MDL
    [M:SOH4]DBPTNUM(NLIG)         = [M:SOH2]BPTNUM
    #[M:SOH4]DEMSTA(NLIG) = 1
    [M:SOH4]DALLTYP(NLIG) = [M:SOH2]ALLTYP
    
    # Ini X3-175968_Expected_Max_delivery_times_on_lines_arent_defaulted (JUCON 2020-02-13)
    If dim([M:SOH4]DEMDLVHOU)>0
      If [M:SOH4]DEMDLVHOU(NLIG)="": [M:SOH4]DEMDLVHOU(NLIG)=[M:SOH2]DEMDLVHOU: Endif
      If [M:SOH4]MAXDLVHOU(NLIG)="": [M:SOH4]MAXDLVHOU(NLIG)=[M:SOH2]DEMDLVHOU: Endif
    Endif
    # End X3-175968_Expected_Max_delivery_times_on_lines_arent_defaulted (JUCON 2020-02-13)
    
    
    End
    #--------------------------------------------------------------------#
    # Initialisation des zones venant de l'article dans une ligne        #
    #--------------------------------------------------------------------#
    Subprog INIT_ITM(NLIG, ITM)
    Value    Integer NLIG
    Value    Char    ITM
    
    Local    Char    VAT(GLONVAT)(3)
    Local    Char    WTSCCOD(GLONADI) (0..5)
    Local    Char    WTSICOD(GLONADI) (0..5)
    Local    Integer WI
    
    [M]FMI(NLIG) = 1
    [M]DEMSTA(NLIG) = 1
    [M]INVFLG(NLIG) = 1 : # 107890 : Scheduled invoices : (LD:08/12/15)
    
    # --> Recherche taxe (même en transformation devis)
    [M:SOH4]VACITM1(NLIG)  = [F:ITM]VACITM(0)
    [M:SOH4]VACITM2(NLIG)  = [F:ITM]VACITM(1)
    [M:SOH4]VACITM3(NLIG)  = [F:ITM]VACITM(2)
    #Call ALITAXEV([M:SOH1]VACBPR,[F:ITM]VACITM,VAT) From TRTX3
    Call RECHVATCOD(1,1,[M:SOH0]BPCORD,ITM,"SOH4",NLIG,VAT) From TRTX3
    [M:SOH4]VAT1(NLIG)  = VAT(0)
    [M:SOH4]VAT2(NLIG)  = VAT(1)
    [M:SOH4]VAT3(NLIG)  = VAT(2)
    If dim([M:SOH4]SSTCOD) >0      : [M:SOH4]SSTCOD(NLIG)  = [F:ITM]SSTCOD   :Endif #101380.n
    If dim([M:SOH4]TSICOD1(NLIG))>0: [M:SOH4]TSICOD1(NLIG) = [F:ITM]TSICOD(0):Endif
    If dim([M:SOH4]TSICOD2(NLIG))>0: [M:SOH4]TSICOD2(NLIG) = [F:ITM]TSICOD(1):Endif
    If dim([M:SOH4]TSICOD3(NLIG))>0: [M:SOH4]TSICOD3(NLIG) = [F:ITM]TSICOD(2):Endif
    If dim([M:SOH4]TSICOD4(NLIG))>0: [M:SOH4]TSICOD4(NLIG) = [F:ITM]TSICOD(3):Endif
    If dim([M:SOH4]TSICOD5(NLIG))>0: [M:SOH4]TSICOD5(NLIG) = [F:ITM]TSICOD(4):Endif
    
    [M:SOH4]SAU(NLIG)       = [F:ITM]SAU
    [M:SOH4]STU(NLIG)       = [F:ITM]STU
    [M:SOH4]SAUSTUCOE(NLIG) = [F:ITM]SAUSTUCOE
    [M:SOH4]DACSAUCOE(NLIG) = [F:ITM]DACSAUCOE
    
    [M:SOH4]STOMGTCOD(NLIG) = [F:ITM]STOMGTCOD
    If [F:ITM]STOMGTCOD>1
        If [F:ITF]ITMREF<>ITM | [F:ITF]STOFCY<>[M:SOH4]DSTOFCY(NLIG)
            Read [ITF] ITF0=ITM;[M:SOH4]DSTOFCY(NLIG)
            If fstat Raz [F:ITF] : Endif
        Endif
    
        # 111481 To init new EDI field USELIMDAT
        If func AFNC.ACTIV("EDIX3")>0
          If [F:ITM]EXYMGTCOD >1 and [M:SOH4]FOCFLG(NLIG)=1
            Local Shortint EXYDAYS
            If [F:ITM]SHLUOM =1: EXYDAYS=[F:ITM]SHL Else EXYDAYS=[F:ITM]SHL*30: Endif
            [M:SOH4]USELIMDAT(NLIG)=[M:SOH4]MAXDLVDAT(NLIG)+EXYDAYS
          Endif
        Endif
        # End 111481
    
        If [F:ITF]STOMGTCOD>0 [M:SOH4]STOMGTCOD(NLIG) = [F:ITF]STOMGTCOD Endif
    Endif
    # Désignation standard
    #[M:SOH4]ITMDES1(NLIG)   = [F:ITS]ITMDES1
    Call CHARGE_DEFITMDES("DES1AXX", GLANGUE,[F:ITM]ITMREF,[M:SOH4]ITMDES1(NLIG), "[F:ITM]") From TRTX3   # FGR 29/06/2009 : X3SUIVI56129
    # Désignation traduite
    #Call CHARGE_ITMDES("DES1AXX", [M:SOH0]LAN,[F:ITM]ITMREF,[M:SOH4]ITMDES(NLIG)) From TRTX3
    #If [M:SOH4]ITMDES(NLIG) = "" [M:SOH4]ITMDES(NLIG) = [M:SOH4]ITMDES1(NLIG) Endif
    Call CHARGE_DEFITMDES("DES1AXX", [M:SOH0]LAN,[F:ITM]ITMREF,[M:SOH4]ITMDES(NLIG), "[F:ITM]") From TRTX3   # FGR 29/06/2009 : X3SUIVI56129
    
    # Si contrat de service --> article non géré en stock
    If [F:ITM]TPLCONSRV <> "" [M:SOH4]STOMGTCOD(NLIG) = 1 Endif
    
    #[M:SOH4]PCK(NLIG)        = [F:ITS]PCK
    #[M:SOH4]PCKCAP(NLIG)     = [F:ITS]PCKCAP
    # Issue X3-66385
    ##CPO 63410 - pb découvert lors de la correction de cette fiche
    ## -- l'unité de vente de la ligne doit être égale à l'UV de l'article
    #If [M:SOH4]SAU(NLIG) = [F:ITM]SAU
    #  Call ALIPCK (ITM, [M:SOH4]DSTOFCY(NLIG), [M:SOH4]PCK(NLIG), [M:SOH4]PCKCAP(NLIG)) From TRTVENDIV
    #Endif
    # End issue X3-66385
    
    # 107890 : Scheduled invoices : (LD:08/12/15)
    [M:SOH4]DLVFLG(NLIG)       = [F:ITM]DLVFLG
    # Invoicing condition managed only for Normal order and
    # For Service/Generic category and type of flow sales and not deliverable
    If [M:SOH0]SOHCAT=1 & [F:ITM]DLVFLG=1
        [M:SOH4]DINVCND(NLIG)=[M:SOH3]INVCND
        If [M:SOH4]DINVCND(NLIG)=""
            [M:SOH4]DINVCND(NLIG)=[F:ITS]INVCND
        Endif
    Endif
    # 107890 : Scheduled invoices : (LD:08/12/15)
    
    If [F:ITU]ITMREF <> ITM | [F:ITU]BPCNUM <> [M:SOH0]BPCORD
       Read [ITU] ITU0=ITM;[M:SOH0]BPCORD
       If fstat Raz [F:ITU] Endif
    Endif
    [M:SOH4]ITMREFBPC(NLIG) = [F:ITU]ITMREFBPC
    If [F:ITU]SAU <> "" & find([M:SOH4]LINTYP(NLIG),1,2,6,10) & [M:SOH4]FOCFLG(NLIG) <> 3
        [M:SOH4]SAU(NLIG) = [F:ITU]SAU
        [M:SOH4]SAUSTUCOE(NLIG) = [F:ITU]SAUSTUCOE
        [M:SOH4]DACSAUCOE(NLIG) = 1
        # Si on récupère l'unité de vente de l'article-client, on récupère aussi l'emballage et la capacité
        [M:SOH4]PCK(NLIG)       = [F:ITU]PCK
        [M:SOH4]PCKCAP(NLIG)    = [F:ITU]PCKCAP
    Endif
    #Call ALISAUCOE(ITM, [M:SOH0]BPCORD, [M:SOH4]SAU(NLIG), [M:SOH4]STU(NLIG), [M:SOH4]SAUSTUCOE(NLIG)) From TRTVENQTE
    
    # Issue X3-66385
    # L'emballage est initialisé en priorité avec l'article client
    # Il est initialisé avec l'article (article site ou catégorie article) uniquement si l'UV de l'article = l'UV de la ligne
    # et si l'UV de l'article client = l'UV de la ligne mais il n'y a pas d'emballage pour l'article client
    # ou si l'UV de l'article client est différente de l'UV de la ligne
    # Package is initialized in priority with product customer
    # It is initialized  with product (product site or product category) only if UV product= UV line
    # and if UV product customer = UV line but there is no package for product customer
    # or  if UV product customer <> UV line
    If [M:SOH4]PCK(NLIG) = ""
        If [M:SOH4]SAU(NLIG) = [F:ITM]SAU
          Call ALIPCK (ITM, [M:SOH4]DSTOFCY(NLIG), [M:SOH4]PCK(NLIG), [M:SOH4]PCKCAP(NLIG)) From TRTVENDIV
        Endif
    Endif
    # End issue X3-66385
    
    Raz [M:SOH4]SOQTEX(NLIG)
    If find(GSALTEXLIN,1,5)
       [M:SOH4]SOQTEX(NLIG) = [F:ITU]ITSTEX
       If [M:SOH4]SOQTEX(NLIG)=""
          [M:SOH4]SOQTEX(NLIG) = [F:ITS]ITSTEX
       Endif
    Endif
    
    [M:SOH4]CTMFLG(NLIG)     = [F:ITS]CTMFLG           : # Bug 55476
    [M:SOH4]YSTOMGTCOD(NLIG) = [M:SOH4]STOMGTCOD(NLIG) : # Bug 55476
    
    # Initialisation du code prépa
    If dim([M:SOH0]TSCCOD) <> -1
        For WI = 1 To dim([M:SOH0]TSCCOD)
            WTSCCOD(WI-1) = [M:SOH0]TSCCOD(WI-1)
        #--CPO 90371 Lors de la correction de cette fiche - ici on fait For WI et Next I
        #Next I
        Next WI
        #--/
    Endif
    If dim([M:SOH4]TSICOD1)>0: WTSICOD(0) = [M:SOH4]TSICOD1(NLIG): Endif
    If dim([M:SOH4]TSICOD2)>0: WTSICOD(1) = [M:SOH4]TSICOD2(NLIG): Endif
    If dim([M:SOH4]TSICOD3)>0: WTSICOD(2) = [M:SOH4]TSICOD3(NLIG): Endif
    If dim([M:SOH4]TSICOD4)>0: WTSICOD(3) = [M:SOH4]TSICOD4(NLIG): Endif
    If dim([M:SOH4]TSICOD5)>0: WTSICOD(4) = [M:SOH4]TSICOD5(NLIG): Endif
    If [F:BPC]BPCNUM<>[M:SOH0]BPCORD
       Read [BPC]BPC0=[M:SOH0]BPCORD : If fstat Raz [F:BPC] Endif
    Endif
    Call REC_PRECOD([M:SOH4]DSTOFCY(NLIG),ITM,[F:ITM]TCLCOD,WTSICOD(0),
    &               WTSICOD(1),WTSICOD(2),WTSICOD(3),WTSICOD(4),[M:SOH0]BPCORD,
    &               [F:BPC]BCGCOD,WTSCCOD(0),WTSCCOD(1),WTSCCOD(2),WTSCCOD(3),
    &               WTSCCOD(4),[M:SOH4]PRECOD(NLIG)) From STKLIB
    
    
    # 107890 : Scheduled invoices : (LC:28/10/16)
    If [M:SOH4]DLVFLG(NLIG)<>2
    
       If [M:SOH0]SOHCAT=1
          Raz [M:SOH4]TDLQTY(NLIG)
          Raz [M:SOH4]DDEMDLVDAT(NLIG)
       Endif
    
       Raz [M:SOH4]DDAYLTI(NLIG)
       Raz [M:SOH4]DSHIDAT(NLIG)
       Raz [M:SOH4]EXTDLVDAT(NLIG)
    
       Raz [M:SOH4]CNDNAM(NLIG)
       Raz [M:SOH4]USEPLC(NLIG)
       Raz [M:SOH4]DDLVPIO(NLIG)
       Raz [M:SOH4]DDRN(NLIG)
       Raz [M:SOH4]DMDL(NLIG)
       Raz [M:SOH4]DBPTNUM(NLIG)
       Raz [M:SOH4]PRECOD(NLIG)
       Raz [M:SOH4]PCK(NLIG)
       Raz [M:SOH4]PCKCAP(NLIG)
       Raz [M:SOH4]DEMSTA(NLIG)
       If func AFNC.ACTIV("EDIX3")>0   #SAM 121329 (JUCON 03/02/2017)
         Raz [M:SOH4]DEMDLVHOU(NLIG)
         Raz [M:SOH4]MAXDLVHOU(NLIG)
         Raz [M:SOH4]MAXDLVDAT(NLIG)
         Raz [M:SOH4]BPCSALPRI(NLIG)
         Raz [M:SOH4]USELIMDAT(NLIG)
      Endif                           #SAM 121329 (JUCON 03/02/2017)
    Endif
    # 107890 : Scheduled invoices : (LC:28/10/16)
    
    End
    #---------------------------------------#
    # Traitement avant ligne                #
    #---------------------------------------#
    Subprog AVANT_LIGNE(NOL)
    Value Integer NOL
    
    Local   Integer  WRETOUR
    Local   Char     WNUMTEX(12)
    
    If GMODIF = 1
    # --> Suppression
        If find([M]LINTYP(NOL),2,10) GMODIF=3 Endif
        If find([M]LINTYP(NOL),6) GMODIF=4 Endif
          # Issue X3-38242 - 2019-03-20 by MUARN : Suppression d'une ligne à l'origine d'un gratuit ou suppression d'un gratuit
          # Si la ligne à l'origine d'un gratuit est issue d'un devis, le gratuit lié n'est pas forcément sur cette commande
          # --> Ne pas gérer la suppression du gratuit
          # Si la ligne de gratuit est issue d'une cde, la ligne à l'origine du gratuit lié n'est pas forcément sur cette commande
          # --> Ne pas gérer la modification de la ligne à l'origine du gratuit
          # deletion of a line at the source of a free product, if the line is from a quote, the free product is not delete
          # deletion of a free product line, if the line is from a quote, do not modify the line at the source of a free produc
          #GFOCFLG = [M]FOCFLG(NOL)
          GFOCFLG = 1
          If [M:SOH4]DETSQHNUM(NOL)=""
             GFOCFLG = [M]FOCFLG(NOL)
          Endif
    #   -----------------------------------------------------#
    #   Suppression du texte si la ligne vient d'être créée  #
    #   -----------------------------------------------------#
    #    If [M]CREFLG(NOL) = 0
    #        WRETOUR = 0
    #        WNUMTEX = [M:SOH4]SOQTEX (NOL)
    #        Call TEX(5,"SOQ1","","","",WNUMTEX,"A",WRETOUR) From TRTX3TEX
    #    Endif
    Endif
    Call SUB_TOT(NOL)
    
    End
    
    
    #-------------------------------------------#
    # Recherche tarif si modif qte ou creation  #
    #-------------------------------------------#
    If GMODIF = 0
        WRECH_TAR = 1
        If [M:SOH4]FOCFLG(NOL) = 2
            GMESSAGE = mess(7,191,1)+"\"+mess(21,191,1)
        Else
            GMESSAGE = mess(21,191,1)
        Endif
        Call OUINON(GMESSAGE,WRECH_TAR) From GESECRAN
        Raz GMESSAGE
    Else
        WRECH_TAR= 2
    Endif
    If WRECH_TAR = 2
        # --------------- Recherche tarif -----------------
        # Article normal ou composé
        TYP=1
        # Composant
        If find([M:SOH4]LINTYP(NOL),3,4,5,7,8,9,11,12)
            Local Integer ORI : ORI=NOL
            While !find([M]LINTYP(ORI),2,6,10) & ORI >= 0 ORI-=1 Wend
            If find([M]LINTYP(ORI),2,6,10) GPNTITMREF=[M]ITMREF(ORI) Endif
            TYP=4
        Endif
        # --> Recherche tarif
        Call RECH_TARIF(TYP,[M]ITMREF(NOL),NOL,VALEUR,"SOH",[M]GROPRI(NOL)) From TRTVENTAR
        # --> Calcul du prix net
        Call CLCNETPRI(VALEUR, [M:SOH0]CUR, NOL) From TRTVENPRI
        # Issue X3-200515/X3-208171 - 2020-09-08 by SR : Progress billing
        #If GDACLOK = 1
        If GDACLOK = 1 | (dim([M:SOH4]PRGBILNUM) > 1 & [M:SOH4]PRGBILNUM(NOL) <> "")
            Call CTLNETPRI([M:SOH0]BPCORD,[M:SOH0]CHGTYP,[M:SOH0]ORDDAT,[M:SOH0]CUR,NOL) From TRTVENPRI
            If mkstat=2 End Endif
        Endif
    Endif
    
    #----------------------------------------------------------------------------------#
    # Vérification des codes taxes :                                                   #
    # Appelé en fin de saisie de ligne pour vérifier si les codes taxes ont changé     #
    #        suite à modification d'un champs entrant dans la détermination de la taxe #
    # --> Si changement : Chargement des codes taxes                                   #
    #                     Recalcul des montants de base calcul taxe (CLCAMT1 et 2)     #
    #                     Dde recherche tarif si TTC                                   #
    #                     Recalcul de la marge                                         #
    #----------------------------------------------------------------------------------#
    Subprog VERIF_VATCOD (NLIG)
    Value Integer NLIG
    
    Local Char    WVAT(GLONVAT)(3)
    Local Integer INICPRPRI : INICPRPRI=1
    
    Call RECHVATCOD(1,1,[M:SOH0]BPCORD,[M:SOH4]ITMREF(NLIG),"SOH4",NLIG,WVAT) From TRTX3
    
    If [M:SOH4]VAT1(NLIG)<>WVAT(0) | [M:SOH4]VAT2(NLIG)<>WVAT(1) | [M:SOH4]VAT3(NLIG)<>WVAT(2)
        [M:SOH4]VAT1(NLIG) = WVAT(0)
        [M:SOH4]VAT2(NLIG) = WVAT(1)
        [M:SOH4]VAT3(NLIG) = WVAT(2)
        # 101874 : V9 : Taxe code control
        #Call TRTRECTARD("SOH", [M:SOH1]CUR, NLIG) From TRTVENTAR
        Local Integer WOK : WOK=1
        # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
        # If the sales order line is linked to a progress billing
        # If there is scheduled invoices linked to a billing situation not invoiced we can't modify the price (to avoid bad price when invoicing)
        # So price calculation has to be inhibited
        # This working flag indicates if, for the sales order line, there is scheduled invoices linked to a billing situation not invoiced
        If dim([M:SOH4]PBILDTOINV) <= 0 | [M:SOH4]PBILDTOINV(NOL)=1
        #   Price calculation can be done only if progress billing is not activated or if there is no scheduled invoices linked to a billing situation not invoiced
        # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
          If !GIMPORT Call OUINON (mess(247,191,1)-":"-mess(21,191,1),WOK) From GESECRAN : Endif
        # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
        Endif
        # 200515 : Progress billing / X3-217465 : Control on sales order line price search - 2020-10-12 by LD
        If WOK=2
          Call TRTRECTARD("SOH", [M:SOH1]CUR, NLIG) From TRTVENTAR
        Endif
        # 101874
        Call CLCPFM([M:SOH4]DSTOFCY(NLIG), [M:SOH1]PRITYP, [M]CHGTYP, [M:SOH0]ORDDAT, [M:SOH0]CUR,
    &           NLIG,INICPRPRI) From TRTVENPRI
    Endif
    
    End
    
    #-------------------------------------#
    # Traitement apres ligne              #
    #-------------------------------------#
    Subprog APRES_LIGNE(NLIG, AFF)
    Value Integer NLIG
    Value Integer AFF
    
    # --> Contrôle du prix net
    Call CTLNETPRI([M:SOH0]BPCORD, [M]CHGTYP, [M]ORDDAT, [M:SOH0]CUR,NLIG) From TRTVENPRI
    #If mkstat=2 End Endif
    # --> Contrôle de la marge
    Call CTLPFM([M:SOH0]CUR,[M:SOH4]CPRPRI(NLIG), NLIG) From TRTVENPRI
    #If mkstat=2 End Endif
    # --> Recalcul de l'état de la ligne de commande
    Gosub CALC_SOQSTA
    # --> Calcul du montant cde ht et ttc de la ligne
    Gosub CALC_ORD
    Gosub CALC_DSP From TRTVENDIV
    # --> Calcul des mnts à livrer ht et ttc de la ligne
    If [M:SOH4]DEMSTA(NLIG) <> 1
         Raz [M:SOH4]LINDLRNOT(NLIG)
         Raz [M:SOH4]LINDLRATI(NLIG)
         # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
         Raz [M:SOH4]LININRSCHNOT(NLIG)
         Raz [M:SOH4]LININRSCHATI(NLIG)
         # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    Else Gosub CALC_DLR   : Endif
    Call ADD_TOT(NLIG)
    
    If AFF=1
       Affzo [M:SOH4]LINORDNOT(NLIG),LINORDATI(NLIG),LINPFM(NLIG), SOQSTA(NLIG)
       Affzo [M:SOH4]10,15,20
    Endif
    
    If func AFNC.ACTIV("EDIX3")>0   # SAM 120075
      If [M:SOH4]MAXDLVDAT(NLIG)=[00/00/00]: [M:SOH4]MAXDLVDAT(NLIG)=[M:SOH4]DDEMDLVDAT(NLIG) : Endif
    Endif                           # SAM 120075
    
    
    End
    #-------------------------------------------------------------#
    # Calcul des montants total de la commande                    #
    #-------------------------------------------------------------#
    Subprog ADD_TOT(NLIG)
    Value Integer NLIG
    Local Decimal MNTPFM
    
    [M:SOH4]ORDNOT += [M:SOH4]LINORDNOT(NLIG)
    [M:SOH4]ORDATI += [M:SOH4]LINORDATI(NLIG)
    [M:SOH4]DLRNOT += [M:SOH4]LINDLRNOT(NLIG)
    [M:SOH4]DLRATI += [M:SOH4]LINDLRATI(NLIG)
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    [M:SOH4]INRSCHNOT += [M:SOH4]LININRSCHNOT(NLIG)
    [M:SOH4]INRSCHATI += [M:SOH4]LININRSCHATI(NLIG)
    
    If [M:SOH0]SOHCAT<>2 & !([M:SOH1]BETFCY=2 & [M:SOH1]BETCPY<=1)
        # To invoice amount not managed for loan order and intracompany order
        [M:SOH4]INRNOT += ([M:SOH4]LINDLRNOT(NLIG)+[M:SOH4]LININRSCHNOT(NLIG))
        [M:SOH4]INRATI += ([M:SOH4]LINDLRATI(NLIG)+[M:SOH4]LININRSCHATI(NLIG))
    Endif
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    [M:SOH4]PFMTOT += [M:SOH4]LINPFM(NLIG)
    [M:SOH0]DSPTOTQTY += [M:SOH4]QTYSTU(NLIG)
    # Issue 107888 - 2016-06-20 by CPO : US120 Normal order -> Invoices (by using a scheduling invoice)
    #[M:SOH0]DSPTOTWEI += [M:SOH4]DSPLINWEI(NLIG)
    #[M:SOH0]DSPTOTVOL += [M:SOH4]DSPLINVOL(NLIG)
    If [M:SOH4]DLVFLG=2
      [M:SOH0]DSPTOTWEI += [M:SOH4]DSPLINWEI(NLIG)
      [M:SOH0]DSPTOTVOL += [M:SOH4]DSPLINVOL(NLIG)
    Else
      Raz [M:SOH4]DSPLINWEI(NLIG), [M:SOH4]DSPLINVOL(NLIG)
    Endif
    # End issue 107888 US120
    
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    #Call MAJ_SFIT_QTY("M", "SOH3", [M:SOH4]DETSQHNUM(NLIG), [M:SOH4]QTYSTU(NLIG), [M:SOH4]LINDLRNOT(NLIG), [M:SOH4]DSPLINWEI(NLIG), [M:SOH4]DSPLINVOL(NLIG)) From SUBSFIT
    If [M:SOH0]SOHCAT=1 & [M:SOH4]DLVFLG(NLIG)=1
        # Normal order and Undeliverable product
        Call MAJ_SFIT_QTY("M", "SOH3", [M:SOH4]DETSQHNUM(NLIG), [M:SOH4]QTYSTU(NLIG), [M:SOH4]LININRSCHNOT(NLIG), [M:SOH4]DSPLINWEI(NLIG), [M:SOH4]DSPLINVOL(NLIG)) From SUBSFIT
    Else
        # Normal order, loan order and Deliverable product
        # Direct invoice order and all products
        Call MAJ_SFIT_QTY("M", "SOH3", [M:SOH4]DETSQHNUM(NLIG), [M:SOH4]QTYSTU(NLIG), [M:SOH4]LINDLRNOT(NLIG), [M:SOH4]DSPLINWEI(NLIG), [M:SOH4]DSPLINVOL(NLIG)) From SUBSFIT
    Endif
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    
    # Issue 106149
    #---------------------------------------------------------------------#
    # Point d'entree pour le calcul  de montants spécifiques              #
    #---------------------------------------------------------------------#
    GPOINT="ADD_TOT" : Gosub ENTREE From EXEFNC
    # End issue 106149
    
    End
    
    Subprog SUB_TOT(NLIG)
    Value Integer NLIG
    Local Decimal MNTPFM
    
    [M:SOH4]ORDNOT -= [M:SOH4]LINORDNOT(NLIG)
    [M:SOH4]ORDATI -= [M:SOH4]LINORDATI(NLIG)
    [M:SOH4]DLRNOT -= [M:SOH4]LINDLRNOT(NLIG)
    [M:SOH4]DLRATI -= [M:SOH4]LINDLRATI(NLIG)
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    [M:SOH4]INRSCHNOT -= [M:SOH4]LININRSCHNOT(NLIG)
    [M:SOH4]INRSCHATI -= [M:SOH4]LININRSCHATI(NLIG)
    
    If [M:SOH0]SOHCAT<>2 & !([M:SOH1]BETFCY=2 & [M:SOH1]BETCPY<=1)
        # To invoice amount not managed for loan order and intracompany order
        [M:SOH4]INRNOT -= ([M:SOH4]LINDLRNOT(NLIG)+[M:SOH4]LININRSCHNOT(NLIG))
        [M:SOH4]INRATI -= ([M:SOH4]LINDLRATI(NLIG)+[M:SOH4]LININRSCHATI(NLIG))
    Endif
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    [M:SOH4]PFMTOT -= [M:SOH4]LINPFM(NLIG)
    [M:SOH0]DSPTOTQTY -= [M:SOH4]QTYSTU(NLIG)
    # Issue 107888 - 2016-06-20 by CPO : US120 Normal order -> Invoices (by using a scheduling invoice)
    #[M:SOH0]DSPTOTWEI -= [M:SOH4]DSPLINWEI(NLIG)
    #[M:SOH0]DSPTOTVOL -= [M:SOH4]DSPLINVOL(NLIG)
    If [M:SOH4]DLVFLG=2
      [M:SOH0]DSPTOTWEI -= [M:SOH4]DSPLINWEI(NLIG)
      [M:SOH0]DSPTOTVOL -= [M:SOH4]DSPLINVOL(NLIG)
    Else
      Raz [M:SOH4]DSPLINWEI(NLIG), [M:SOH4]DSPLINVOL(NLIG)
    Endif
    # End issue 107888 US120
    
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    #Call MAJ_SFIT_QTY("M", "SOH3", [M:SOH4]DETSQHNUM(NLIG), -1*[M:SOH4]QTYSTU(NLIG), -1*[M:SOH4]LINDLRNOT(NLIG), -1*[M:SOH4]DSPLINWEI(NLIG), -1*[M:SOH4]DSPLINVOL(NLIG)) From SUBSFIT
    If [M:SOH4]DLVFLG(NLIG)=1
        # Normal order and Undeliverable product
        Call MAJ_SFIT_QTY("M", "SOH3", [M:SOH4]DETSQHNUM(NLIG), -1*[M:SOH4]QTYSTU(NLIG), -1*[M:SOH4]LININRSCHNOT(NLIG), -1*[M:SOH4]DSPLINWEI(NLIG), -1*[M:SOH4]DSPLINVOL(NLIG)) From SUBSFIT
    Else
        # Normal order, loan order and Deliverable product
        # Direct invoice order and all products
        Call MAJ_SFIT_QTY("M", "SOH3", [M:SOH4]DETSQHNUM(NLIG), -1*[M:SOH4]QTYSTU(NLIG), -1*[M:SOH4]LINDLRNOT(NLIG), -1*[M:SOH4]DSPLINWEI(NLIG), -1*[M:SOH4]DSPLINVOL(NLIG)) From SUBSFIT
    Endif
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    
    # Issue 106149
    #---------------------------------------------------------------------#
    # Point d'entree pour le calcul  de montants spécifiques              #
    #---------------------------------------------------------------------#
    GPOINT="SUB_TOT" : Gosub ENTREE From EXEFNC
    # End issue 106149
    
    End
    
    
    #-----------------------------------------#
    # Suppression d'une ligne dans le tableau #
    #-----------------------------------------#
    Subprog SUP_LIG(NLIG, WRET)
    Value    Integer NLIG
    Variable Integer WRET    : WRET = 0
    
    # --> pas de suppression si ligne préparée/livrée/facturée
    If ([M]TALLQTY(NLIG)-[M]ALLQTY(NLIG)+[M]LPRQTY(NLIG)) <> 0 WRET = 1 : End : Endif
    
    Call SUB_TOT(NLIG) From SUBSOHB
    If dim([M]ITMREF) = [M]NBLIG
         Dela NLIG,1 [M:SOH4]NBLIG
    Else Dela NLIG,1,[M:SOH4]NBLIG-1 [M:SOH4]NBLIG : Endif
    
    [M:SOH4]NBLIG -=1
    End
    
    #---------------------------------------------------------------------------------#
    #             Traitement de solde d'une ligne de commande                         #
    #---------------------------------------------------------------------------------#
    #   Appelé depuis le bouton solde d'une ligne de commande                         #
    #   Appelé depuis le composant GENSOH (Génération d'une commande de vente)        #
    #---------------------------------------------------------------------------------#
    $TRT_CLESOQ
    
    # --> Solde de la ligne, les mnts à livrer passent à 0
    If [M]SOQSTA(NLIG) <> 3
       [M]SOQSTA(NLIG) = 3
    #  -- Raz de la quantité à allouer
       Raz [M:SOH4]WALLQTY(NLIG), WALLQTYSTU(NLIG)
       [M:SOH4]DLRNOT -= [M:SOH4]LINDLRNOT(NLIG)
       [M:SOH4]DLRATI -= [M:SOH4]LINDLRATI(NLIG)
       # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
       [M:SOH4]INRSCHNOT -= [M:SOH4]LININRSCHNOT(NLIG)
       [M:SOH4]INRSCHATI -= [M:SOH4]LININRSCHATI(NLIG)
       # To invoice amount not managed for loan order and intracompany order
       If [M:SOH0]SOHCAT<>2 & !([M:SOH1]BETFCY=2 & [M:SOH1]BETCPY<=1)
          [M:SOH4]INRNOT -= ([M:SOH4]LINDLRNOT(NLIG)+[M:SOH4]LININRSCHNOT(NLIG))
          [M:SOH4]INRATI -= ([M:SOH4]LINDLRATI(NLIG)+[M:SOH4]LININRSCHATI(NLIG))
       Endif
       Raz [M:SOH4]LININRSCHNOT (NLIG), [M:SOH4]LININRSCHATI(NLIG)
       # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
       Raz [M:SOH4]LINDLRNOT (NLIG), [M:SOH4]LINDLRATI(NLIG)
    
       # 107888 : Scheduled invoices : (LD:20/05/16)
       #If [M:SOH0]SOHCAT <> 3
       If [M:SOH0]SOHCAT <> 3 & [M]DLVFLG(NLIG)=2
          # Commande normale/prêt et ligne livrable
       # 107888 : Scheduled invoices : (LD:20/05/16)
    #  -- La ligne est facturée si tout ce qui est livré est facturé
          If [M]INVQTY(NLIG) <> 0 & [M]INVQTY(NLIG) >= [M]DLVQTY(NLIG) + [M]ODLQTY(NLIG)
              [M]INVFLG(NLIG) = 2
          Endif
       Else
          # Commande à facturation directe              : # 107888 : Scheduled invoices : (LD:20/05/16)
          # Commande normale et ligne non livrable      : # 107888 : Scheduled invoices : (LD:20/05/16)
    #  -- La ligne est facturée si tout ce qui est commandé est facturé
          If ([M]INVQTY(NLIG) <> 0 | [M]ODLQTY(NLIG) <> 0)
    &       & [M]INVQTY(NLIG) + [M]ODLQTY(NLIG) >= [M]QTY(NLIG)
             [M]INVFLG(NLIG) = 2
          Endif
       Endif
    
       If [M:SOH4]DCCLREN(NLIG) <> "" [M:SOH4]DCCLDAT(NLIG)=date$ Endif
       # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
       #--All invoice schedule line that have a status other than "invoiced"/"credit memo" are set to "closed"
       If [M:SOH4]DINVCND(NLIG)<>""
          Gosub TRT_CLESOQ_CLOSED From LIBSAL_INVCND_SOH
          If GERR=1 : Return : Endif
       Endif
       # End issue 107888
    Else
    # --> Réactivation de la ligne, les mnts à livrer sont recalculés
       [M]SOQSTA(NLIG) = 1
       Gosub CALC_DLR From SUBSOHB
       [M:SOH4]DLRNOT += [M:SOH4]LINDLRNOT(NLIG)
       [M:SOH4]DLRATI += [M:SOH4]LINDLRATI(NLIG)
       # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
       [M:SOH4]INRSCHNOT += [M:SOH4]LININRSCHNOT(NLIG)
       [M:SOH4]INRSCHATI += [M:SOH4]LININRSCHATI(NLIG)
       # To invoice amount not managed for loan order and intracompany order
       If [M:SOH0]SOHCAT<>2 & !([M:SOH1]BETFCY=2 & [M:SOH1]BETCPY<=1)
          [M:SOH4]INRNOT += ([M:SOH4]LINDLRNOT(NLIG)+[M:SOH4]LININRSCHNOT(NLIG))
          [M:SOH4]INRATI += ([M:SOH4]LINDLRATI(NLIG)+[M:SOH4]LININRSCHATI(NLIG))
       Endif
       # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
       [M]INVFLG(NLIG) = 1
       Raz [M:SOH4]DCCLREN(NLIG),[M:SOH4]DCCLDAT(NLIG)
       # Issue 107888 - 2015-10-28 by CPO : Scheduled invoices object management
       #--All invoice schedule line that have a status other than "invoiced"/"credit memo" are set to "not invoiced"
       If [M:SOH4]DINVCND(NLIG)<>""
          Gosub TRT_CLESOQ_NOTCLOSED From LIBSAL_INVCND_SOH
          If GERR=1 : Return : Endif
       Endif
       # End issue 107888
    Endif
    [M]UPDFLG(NLIG)     = 1
    [M]WUPDAPPFLG(NLIG) = 2
    If GREV=2 [M]LINREVNUM(NLIG) = [M:SOH0]REVNUM:Endif
    
    Return
    #---------------------------------------------------------------------------------#
    #             Recalcul de l'état solde de la ligne commande                       #
    #---------------------------------------------------------------------------------#
    #   Solde automatique si aucune allocation en cours et si tout est livré/facturé  #
    #   (Pas de désolde automatique puisqu'on ne peut plus modifier une ligne soldée) #
    #---------------------------------------------------------------------------------#
    $CALC_SOQSTA
    #If [M]SOQSTA(NLIG) <> 3 & [M]ALLQTY(NLIG) = 0 & [M]WALLQTY(NLIG) = 0 & [M]QTY(NLIG) <> 0
    If [M]SOQSTA(NLIG) <> 3 & ([M]WALLQTY(NLIG)-[M]SHTQTY(NLIG)) = 0 & [M]QTY(NLIG) <> 0
    
        # 107888 : Scheduled invoices : (LD:20/05/16)
        #If [M:SOH0]SOHCAT <> 3
        If [M:SOH0]SOHCAT <> 3 & [M]DLVFLG(NLIG) = 2
    #       -- Commande normale /prêt et ligne livrable
        # 107888 : Scheduled invoices : (LD:20/05/16)
            If [M]DLVQTY(NLIG) + [M]ODLQTY(NLIG) >= [M]QTY(NLIG)
                [M]SOQSTA(NLIG)=3
    #           -- La ligne est facturée si tout ce qui est livré est facturé
                If [M]INVQTY(NLIG) <> 0 & [M]INVQTY(NLIG) >= [M]DLVQTY(NLIG) + [M]ODLQTY(NLIG)
                    [M]INVFLG(NLIG) = 2
                Endif
            Endif
        Else
    # 107888 : Scheduled invoices : (LD:20/05/16)
    #       -- Commande à facturation directe
    #       -- Commande normale et ligne non livrable
    # 107888 : Scheduled invoices : (LD:20/05/16)
            If [M]INVQTY(NLIG) + [M]ODLQTY(NLIG) >= [M]QTY(NLIG)
                [M]SOQSTA(NLIG)=3
    #           -- La ligne est facturée si tout ce qui est commandé est facturé
                If ([M]INVQTY(NLIG) <> 0 | [M]ODLQTY(NLIG) <> 0)
    &             & [M]INVQTY(NLIG) + [M]ODLQTY(NLIG) >= [M]QTY(NLIG)
                    [M]INVFLG(NLIG) = 2
                Endif
            Endif
        Endif
    Endif
    Return
    
    #--------------------------------------------------------------#
    # Calcul des montants à livrer HT et TTC d'une ligne commnande #
    # Calcul To invoice amount - tax and + tax for an order line   # : # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    #--------------------------------------------------------------#
    $CALC_DLR
    Local Decimal WMNTCALCNOT, WMNTCALCATI : # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    Local Decimal QTY
    
    # 107888 : Scheduled invoices : (LD:20/05/16)
    #If [M:SOH0]SOHCAT = 3
    If [M:SOH0]SOHCAT = 3 | ([M:SOH0]SOHCAT = 1 & [M]DLVFLG(NLIG) = 1)
    #       -- Commande à facturation directe
    #       -- Commande normale et ligne non livrable
    # 107888 : Scheduled invoices : (LD:20/05/16)
        QTY    = [M:SOH4]QTY(NLIG) - [M:SOH4]INVQTY(NLIG) - [M:SOH4]ODLQTY(NLIG)
    Else
    # 107888 : Scheduled invoices : (LD:20/05/16)
    #       -- Commande normale /prêt et ligne livrable
    # 107888 : Scheduled invoices : (LD:20/05/16)
        QTY    = [M:SOH4]QTY(NLIG) - [M:SOH4]DLVQTY(NLIG) - [M:SOH4]ODLQTY(NLIG)
    Endif
    If QTY < 0 QTY = 0 Endif
    
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    ## Montant net HT à livrer de la ligne
    #MNTCALC = QTY*[M:SOH4]NETPRINOT(NLIG)
    #Call ARRDEV (MNTCALC, [M:SOH0]CUR) From TRTDIV
    #[M:SOH4]LINDLRNOT(NLIG) = MNTCALC
    ## Montant net TTC à livrer de la ligne
    #MNTCALC = QTY*[M:SOH4]NETPRIATI(NLIG)
    #Call ARRDEV (MNTCALC, [M:SOH0]CUR) From TRTDIV
    #[M:SOH4]LINDLRATI(NLIG) = MNTCALC
    #If [M:SOH4]SOQSTA(NLIG) = 3
    #   Raz [M:SOH4]LINDLRNOT(NLIG)
    #   Raz [M:SOH4]LINDLRATI(NLIG)
    #Endif
    
    WMNTCALCNOT = QTY*[M:SOH4]NETPRINOT(NLIG)
    Call ARRDEV (WMNTCALCNOT, [M:SOH0]CUR) From TRTDIV
    WMNTCALCATI = QTY*[M:SOH4]NETPRIATI(NLIG)
    Call ARRDEV (WMNTCALCATI, [M:SOH0]CUR) From TRTDIV
    
    # Alimentation To deliver - tax and + tax amount
    # -- Loan           order
    # -- Direct invoice order
    # -- Normal         order and deliverable product
    If find([M:SOH0]SOHCAT,2,3) | [M]DLVFLG(NLIG) = 2
        # To deliver - tax for the line
        [M:SOH4]LINDLRNOT(NLIG) = WMNTCALCNOT
        # To deliver + tax for the line
        [M:SOH4]LINDLRATI(NLIG) = WMNTCALCATI
        If [M:SOH4]SOQSTA(NLIG) = 3
           Raz [M:SOH4]LINDLRNOT(NLIG)
           Raz [M:SOH4]LINDLRATI(NLIG)
        Endif
    Endif
    # Alimentation To scheduled invoice - tax and + tax amount
    # -- Normal         order and undeliverable product
    If [M:SOH0]SOHCAT = 1 & [M]DLVFLG(NLIG) = 1
        # To scheduled invoice - tax for the line
        [M:SOH4]LININRSCHNOT(NLIG) = WMNTCALCNOT
        # To scheduled invoice + tax for the line
        [M:SOH4]LININRSCHATI(NLIG) = WMNTCALCATI
        If [M:SOH4]SOQSTA(NLIG) = 3
           Raz [M:SOH4]LININRSCHNOT(NLIG)
           Raz [M:SOH4]LININRSCHATI(NLIG)
        Endif
    Endif
    # 107888 : Scheduled invoices : New fields 'To invoice' - X3-15763 (LD:12/12/16)
    
    Return
    
    #-------------------------------------------------------------#
    # Calcul des montants commande ht et ttc d'une ligne commande #
    #-------------------------------------------------------------#
    $CALC_ORD
    Local Decimal MNTCALC
    
    # Bug 65534
    Local Char VAT(GLONVAT)(3)
    VAT (0) = [M]VAT1(NLIG)
    VAT (1) = [M]VAT2(NLIG)
    VAT (2) = [M]VAT3(NLIG)
    If [M:SOH1]PRITYP=1
        # Montant net HT commandé de la ligne
        MNTCALC = [M]QTY(NLIG) * [M]NETPRINOT(NLIG)
        Call ARRDEV (MNTCALC, [M:SOH0]CUR) From TRTDIV
        [M]LINORDNOT(NLIG) = MNTCALC
        # Montant net TTC commandé de la ligne
        #MNTCALC = [M]QTY(NLIG) * [M]NETPRIATI(NLIG)
        # Bug 45662 : Calcul Montant TTC en repartant du Montant HT pr éviter les pbs d'arrondis
    #    Call CLCTAXEMNT([M]LINORDNOT(NLIG),VAT,[M:SOH1]PRITYP,GSOCIETE,[M:SOH0]ORDDAT,[M]CLCAMT1(NLIG),[M]CLCAMT2(NLIG),                : # Bug 71296
    #&                   MNTCALC) From TRTX3                                                                                             : # Bug 71296
        Call CLCTAXEMNTV([M]LINORDNOT(NLIG),VAT,[M:SOH1]PRITYP,GSOCIETE,[M:SOH0]ORDDAT,[M:SOH1]VACBPR,[M]CLCAMT1(NLIG),[M]CLCAMT2(NLIG),
    &                   MNTCALC) From TRTX3
        #X3-122517
        If func AFNC.ACTIV("LTA") & [F:CPY]SSTTAXACT = 2
            MNTCALC = [M]QTY(NLIG) * [M]NETPRIATI(NLIG)
        Endif
        #X3-122517                                                                                : # Bug 71296
        Call ARRDEV (MNTCALC, [M:SOH0]CUR) From TRTDIV
        [M]LINORDATI(NLIG) = MNTCALC
    Else
        # Bug 65534
        # Montant net TTC commandé de la ligne
        MNTCALC = [M]QTY(NLIG) * [M]NETPRIATI(NLIG)
        Call ARRDEV (MNTCALC, [M:SOH0]CUR) From TRTDIV
        [M]LINORDATI(NLIG) = MNTCALC
    
        # Montant net HT commandé de la ligne
        # Calcul Montant HT en repartant du Montant TTC pr éviter les pbs d'arrondis
    #    Call CLCTAXEMNT([M]LINORDATI(NLIG),VAT,[M:SOH1]PRITYP,GSOCIETE,[M:SOH0]ORDDAT,[M]CLCAMT1(NLIG),[M]CLCAMT2(NLIG),                : # Bug 71296
    #&                   MNTCALC) From TRTX3                                                                                             : # Bug 71296
        Call CLCTAXEMNTV([M]LINORDATI(NLIG),VAT,[M:SOH1]PRITYP,GSOCIETE,[M:SOH0]ORDDAT,[M:SOH1]VACBPR,[M]CLCAMT1(NLIG),[M]CLCAMT2(NLIG),
    &                   MNTCALC) From TRTX3                                                                                              : # Bug 71296
         Call ARRDEV (MNTCALC, [M:SOH0]CUR) From TRTDIV
        [M]LINORDNOT(NLIG) = MNTCALC
    Endif
    
    # Marge de la ligne
    MNTCALC = [M]QTY(NLIG) * [M]PFM(NLIG)
    Call ARRDEV (MNTCALC, [M:SOH0]CUR) From TRTDIV
    [M]LINPFM(NLIG) = MNTCALC
    
    If [F:ITM]ITMREF <> [M]ITMREF(NLIG)
        Read [ITM]ITM0=[M]ITMREF(NLIG)
        If fstat Raz [F:ITM] Endif
    Endif
    
    # Issue 116789
    #---------------------------------------------------------------------#
    # Point d'entree pour le calcul  de montants spécifiques              #
    #---------------------------------------------------------------------#
    GPOINT="CALC_ORD" : Gosub ENTREE From EXEFNC
    # End issue 116789
    
    Return
    
    #########################################################################
    #     GENERATION d'une COMMANDE à partir du bouton COMMANDE             #
    #     de la gestion des devis                                           #
    #########################################################################
    #- X3Suivi 69847 Génération commande depuis devis --#
    $GEN_COM
    Local Integer I
    Local Char WSOHTYP(GLONTSO)
    Local Integer  WSOHCAT
    Local Char WSDHTYP(GLONTSD)
    
      Default Mask [SOH1]
      Gosub RAZCRE From SUBSOHA1 # SAM 120556
      GREP="C"
      GOK = 1
      Read [SQH]SQH0=[M:SQH0]SQHNUM
      If fstat
        Call RSTA ("SQH",[M:SQH0]SQHNUM) From GLOCK
        Raz GOK
        Return
      Endif
      Call TEMPON("V") From GESECRAN
      Raz WSOHTYP                          # FGR 26/02/2015 : X3SUIVI104383
      #If GFCY<>[F:SQH]SALFCY              # FGR 26/02/2015 : X3SUIVI104383 : je ne vois pas pourquoi ce test ?
        GFCY = [F:SQH]SALFCY
        # Ctrl site par défaut par rapport au critère, si aucun site par défaut, charge le 1er site correspondant au critere
        Call GETFCYDEF(GFCY,"[F:FCY]SALFLG=2") From TRTX3
        Call GLOBVAR(GFCY,"VEN") From TRTX3 : #--- Récup param vente site / société
        Gosub CHARG_PARAM From SUBSOHA      : #-- Chargement globales référenciels, comptes et sections de la société
        ## Alimentation du type de commande avec le premier existant
        # --------------------------------------
        # FGR 23/02/2015 : X3SUIVI104383 (début)
        #Gosub SOHTYP From TRTVENCDE
        WSOHTYP = [F:SQH]SOHTYP             # 1°) on prend celui qui est sur le devis
        If WSOHTYP = "" Then
          If GQUOORDCAT = 2 Then
            WSOHTYP = GSOHTYPINV           # 2°) s'il est vide on prend celui du paramètre SOHTYPINV
          Else
            WSOHTYP = GSOHTYPNOR           # 2°) s'il est vide on prend celui du paramètre SOHTYPNOR
          Endif
        Endif
        # Issue X3-218177/245890 - 2021-05-11 by MUARN : Check leg before
        #If WSOHTYP = "" Then
        #  Gosub SOHTYP From TRTVENCDE       # 3°) S'il est vide on prend le premier par ordre alpha.
        # Issue 116275
        #Else
        #  Local Integer IRET
    
        #  Call LEC_TSO_LEG(GCURLEG, WSOHTYP, IRET) From TRTLECLEG
        #  WSOHCAT = [F:TSO]SOHCAT
        #  WSDHTYP = [F:TSO]SDHTYP
        #  GCPT    = [F:TSO]CODNUM
        #  GMANCOU = [F:TSO]MANCOU
        # End issue 116275
        #Endif
        # Issue X3-218177/245890 - 2021-05-11 by MUARN : Check leg
        If WSOHTYP<>""
          Call CONTTSO(WSOHTYP,GCURLEG,"SOH0","SOHTYP",GFCY,"",GSOCIETE) From SUBTSO
          If mkstat
            Raz WSOHTYP
          Endif
        Endif
        If WSOHTYP = ""
          Raz GMESSAGE
          Raz mkstat
          # Search for first type available
          Gosub SOHTYP From TRTVENCDE
        Endif
        If WSOHTYP<>""
          [M:SOH0]SOHTYP =  WSOHTYP
          [M:SOH0]SOHCAT = [F:TSO]SOHCAT
          [M:SOH2]SDHTYP = [F:TSO]SDHTYP
          WRECTYP = [F:TSO]RECTYP
          WSOHCAT = [F:TSO]SOHCAT
          WSDHTYP = [F:TSO]SDHTYP
          GCPT    = [F:TSO]CODNUM
          GMANCOU = [F:TSO]MANCOU
          Call AP_SOHTYP([M:SOH0]SOHTYP) From SUBSOH
          If GERR=1 Return Endif
          Call AM_SOHTYP([M:SOH0]SOHTYP) From SUBSOH
        Endif
        # End issue X3-218177/245890
    
    
        # FGR 23/02/2015 : X3SUIVI104383 (fin)
        # --------------------------------------
        [M:SOH0]SOHTYP=WSOHTYP
        # FGR 15/11/2012 : X3SUIVI71937 (début)
        Call C_SOHTYP([M:SOH0]SOHTYP) From W1SOH0
        If mkstat Then
          Goto NO_ORDRE_CREATE
        Endif
        # FGR 15/11/2012 : X3SUIVI71937 (fin)
        # [M:SOH0]SOHCAT=WSOHCAT # Issue X3-218177/245890 - 2021-05-11 by MUARN : not necessayr, done before
        # 75115 : V7 : Extension of Digital Signature : New field delivery type
        #[M:SOH2]SDHTYP=WSDHTYP # Issue X3-218177/245890 - 2021-05-11 by MUARN : not necessayr, done before
      #Endif
      If clalev([F:SQD2])=0  : Local File SQUOTED [SQD2]   : Endif  # Devis
      Filter [SQD2] Where SQHNUM=[M:SQH0]SQHNUM
      For [SQD2]
        # Issue 110013 - 20150807 by LD
        # Issue 110706
    #    # Components for Fixed Kit/Flexible Kit/Subcontract are generated with parent item so they are not considered there
    #    If find([F:SQD2]LINTYP,1,2,6,10)
        # Components for Fixed Kit/Subcontract are generated with parent item so they are not considered there
        If !find([F:SQD2]LINTYP,3,4,5,11,12,13)
        # End issue 110706
        # Issue 110013
            [F:SQD]SQDLIN = [F:SQD2]SQDLIN
            #-- Lecture du détail lignes devis et génération commandes  --#
            Gosub SEL From SUBSOHC
            # 101841 : Recherche interdit si adresse de livraison vide sur le devis
            # Si l'article est interdit, on ne génère pas la ligne
            If GERR=1
              Call ERREUR(GMESSAGE) From GESECRAN
            Endif
            # 101841
            # 108767 (LD:15/06/15) : Il faut dépositionner mkstat pour traiter correctement les lignes suivantes
            Raz mkstat
            # 108767 (LD:15/06/15)
            Raz GERR              # FGR 02/12/2011 : X3SUIVI71065
        # Issue 110013
        Endif
        # Issue 110013
      Next
      Filter [SQD2]
      Call PJT_INFO_MSG() From TRTPJT   # FGR 15/12/2011 : X3SUIVI71065
      GREP="" : # On gère le mode création
      #Raz currbox
    $NO_ORDRE_CREATE  # FGR 15/11/2012 : X3SUIVI71937
      If [M:SOH4]NBLIG=0
        GERR=1
        GMESSAGE=mess(322,192,1)
        Raz GOK  # Commande non créee
      Endif
      If GOK=0
        Goto GEN_COM_FIN
      Endif
      # Création de la commande
      Gosub CREATION From GOBJET1
    $GEN_COM_FIN
      Call TEMPOFF From GESECRAN
    Return
    
    #--CPO 82311 Acomptes sur commande et modification du client facturé ou du tiers payeur
    #--Mise à jour du client facture/tiers payeur sur les échéances d'acomptes d'une commandes
    #-------------GMODBPCINV = 1 si modif du client facture
    #-------------GMODBPCPYR = 1 si modif du tiers payeur
    $UPDATE_DUD_SOH_MODBPC
    #--Pas de maj si nous ne sommes pas sur la gestion des cdes ou si on ne vient pas des cdes d'achat (inter-site)
    If GFONC1<>"GESSOH" & GFONC1<>"GESPOH" Return Endif
    #--
    If dim(MODBPCINV)<0 | dim(MODBPCPYR)<0 : Return : Endif
    
    #--Pas de maj si nous sommes en création ou duplication
    If GREP="C" or GREP="D" Return Endif
    
    Local Integer WOUVDUD : WOUVDUD=0
    If clalev([F:DUD])=0 : WOUVDUD=1 : Local File GACCDUDATE [DUD] : Endif
    
    #--On reporte la modification sur les échéances (qu'elles soient réglées ou non)
    If MODBPCINV=1 and [F:SOH]BPCINV<>""
      Update [F:DUD] Where TYP="*SO" and NUM=[F:SOH]SOHNUM With BPR=[F:SOH]BPCINV
      If fstat GOK=0 : Call FSTA("DUD") From GLOCK : Goto FIN_RETURN : Endif
    Endif
    #--On reporte la modification sur les échéances (non réglées ou partiellement réglées ???)
    If MODBPCPYR=1 and [F:SOH]BPCPYR<>"" and [F:SOH]BPAPYR<>""
      #--Attente réponse CH (par rapport aux commentaires de CP sur fiche SAM)
      Update [F:DUD] Where TYP="*SO" and NUM=[F:SOH]SOHNUM and (PAYCUR=0 and TMPCUR=0 and FLGCLE<2)
    &                With BPRPAY=[F:SOH]BPCPYR,BPAPAY=[F:SOH]BPAPYR
      If fstat GOK=0 : Call FSTA("DUD") From GLOCK : Goto FIN_RETURN : Endif
    Endif
    
    #--Appel du traitement d'historisation des modifs des échéances
    If (MODBPCINV=1 and [F:SOH]BPCINV<>"") | (MODBPCPYR=1 and [F:SOH]BPCPYR<>"" and [F:SOH]BPAPYR<>"")
      For [F:DUD]DUD0 Where TYP="*SO" and NUM=[F:SOH]SOHNUM
        If MODBPCINV=1 | (MODBPCPYR=1 and ([F:DUD]PAYCUR=0 and [F:DUD]TMPCUR=0 and [F:DUD]FLGCLE<2))
          #--Si modif client facture => on historise sans condition (on a mis à jour les échéances)
          Call HISTOECH("DUD",1,[F:SOH]ORDDAT)From MODECHE
        Endif
      Next
    Endif
    #--
    
    $FIN_RETURN
    Raz MODBPCINV,MODBPCPYR
    If WOUVDUD=1
      Close Local File [DUD]
      Default File [SOH]
    Endif
    
    Return
    #--/CPO
    
    
    #########################################################################
    # TRAITEMENTS LIES AU PICKING DES DEVIS                                 #
    #########################################################################
    # Issue 110706 - 20150904 by LD : Picking devis et composé nomenclature
    # Issue 120966 - 20170126 by LD : Sales quotes: Issue on free product with BOM
    # Issue X3-160406 - 2019-10-11 by SR : Active/Inactive customer control
    
    #########################################################################
    # Actions de l'objet                                                    #
    #########################################################################
    
    #########################################################################
    $HINT_KEY
    
    Case currbox
     When GBOXSQ1 : HINTLIS(val(right$(GBOXSQ1,8)))="SQD1"
     When Default : Return
    Endcase
    
    Return
    
    #########################################################################
    $TIROIR
    
    ILIS=val(right$(currbox,8))
    Gosub REMP_LISGAU From GOBJSUB
    WPICK=2
    Gosub RAFFRAICHI
    
    Return
    
    #########################################################################
    $REMP_DERLU
    
    #MAE, pour raz dernier lu si navigation autre que depuis client ou demande service
    If GFONC1<>"GESSOH"
       If GPILNAV>1
          If !find(GNAVIG(GPILNAV-1),"GESBPC","GESSRE","FUNCMG3")
             adxmxl=0
          Endif
       Else
          adxmxl=0
       Endif
    Endif
    
    Return
    
    #########################################################################
    $FILGAUCHE
    
    Local Date WSHIDAT
    
    #MAE, pour raz liste gauche si navigation autre que depuis client ou demande service
    If GFONC1<>"GESSOH"
       If GPILNAV>1
          If !find(GNAVIG(GPILNAV-1),"GESBPC","GESSRE","FUNCMG3")
             If ILIS=0 adxmxl=0 Endif
          Endif
       Elsif ILIS=0
          adxmxl=0
       Endif
    Endif
    
    Case currbox
     When GBOXSQ1 : Gosub FILGAUCHE1
     When Default : Return
    Endcase
    
    Return
    
    #########################################################################
    $FILGAUCHE1
    # Si pas de clé courante(sauf si création) ou commande soldée, ou commande de pret
    # --> Rien dans la liste de picking
    # FGR 16/01/2015 : X3SUIVI88435 (début)
    #If (GREP="" & !CLECUR) | [M]ORDSTA=2 | [M]SOHCAT=2
    #   FILGAUSUP(0)='[F:SQD]ORDFLG=99'
    #   Return
    #Endif
    Local Integer IPE_QUOTE_LOAN
    
      # PE pour permettre de sélectionner des devis sur commandes de prêt.
      # Par défaut IPE_QUOTE_LOAN = 0 : pas de devis pour les commandes de prêt
      # Pour tout autre valeur, la liste des devis sera proposée (à condition que les autres conditions
      # soient respectées ((GREP="" & !CLECUR) | [M]ORDSTA=2). Elles sont incontournables.
      # IPE_QUOTE_LOAN n'est testé que pour les commandes de prêt ([M]SOHCAT=2). Son contenu est ignoré sinon
      IPE_QUOTE_LOAN = 0
      GPOINT = "SQUOTELOAN" : Gosub ENTREE From EXEFNC
      If (GREP="" & !CLECUR) | [M]ORDSTA=2 | ([M]SOHCAT=2 and IPE_QUOTE_LOAN = 0) Then
       FILGAUSUP(0)='[F:SQD]ORDFLG=99'
       Return
      Endif
    # FGR 16/01/2015 : X3SUIVI88435 (fin)
    
    # Les lignes ne doivent pas être transformées
    FILGAUSUP(0) = '[F:SQD]ORDFLG=1'
    ##VPO 05/05/09 51742 pb listes gauches et CZ (modif FILGAUCHE et APRES_MODIF)
    ##If COUZON="SALFCY"
    ##   If CZ<>""        FILGAUSUP(0)+='&[F:SQD]SALFCY=CZ'           Endif
    ##Else
    ##   If [M]SALFCY<>"" FILGAUSUP(0)+='&[F:SQD]SALFCY=[M]SALFCY'    Endif
    ##Endif
    If [M]SALFCY<>"" FILGAUSUP(0)+='&[F:SQD]SALFCY=[M]SALFCY'    Endif
    
    If find(REPONSE,GSTARAF,GSTATIR,GSTAPRG,GSTASVG)
       ##VPO 05/05/09 51742 pb listes gauches et CZ (modif FILGAUCHE et APRES_MODIF)
       ##If COUZON="BPCORD"
       ##   If CZ<>""        FILGAUSUP(0)+='&[F:SQD]BPCORD=CZ'        Endif
       ##Else
       ##   If [M]BPCORD<>"" FILGAUSUP(0)+='&[F:SQD]BPCORD=[M]BPCORD' Endif
       ##Endif
       If [M]BPCORD<>"" FILGAUSUP(0)+='&[F:SQD]BPCORD=[M]BPCORD' Endif
    Else
       ##VPO 05/05/09 51742 pb listes gauches et CZ (modif FILGAUCHE et APRES_MODIF)
       ##If COUZON="BPCORD"
       ##   FILGAUSUP(0)+='&[F:SQD]BPCORD=CZ'
       ##Else
       ##   FILGAUSUP(0)+='&[F:SQD]BPCORD=[M]BPCORD'
       ##Endif
       FILGAUSUP(0)+='&[F:SQD]BPCORD=[M]BPCORD'
    Endif
    
    # Si on ne gère pas les adresses de liv à la ligne, on filtre l'adresse de liv
    If GLINBPD=1
        ##VPO 05/05/09 51742 pb listes gauches et CZ (modif FILGAUCHE et APRES_MODIF)
        ##If COUZON="BPAADD"
        ##   If CZ <>"" FILGAUSUP(0)+='&([F:SQD]BPAADD="" | [F:SQD]BPAADD=CZ)' Endif
        ##Else
        ##   If [M]BPAADD<>"" FILGAUSUP(0)+='&([F:SQD]BPAADD="" | [F:SQD]BPAADD=[M]BPAADD)' Endif
        ##Endif
        If [M]BPAADD<>"" FILGAUSUP(0)+='&([F:SQD]BPAADD="" | [F:SQD]BPAADD=[M]BPAADD)' Endif
    Endif
    
    # Ne pas filtrer sur le site expédition
    
    If [M]NBLIG <> 0
       ##VPO 05/05/09 51742 pb listes gauches et CZ (modif FILGAUCHE et APRES_MODIF)
       ##If COUZON="PTE"
       ##   If CZ<>""     FILGAUSUP(0)+='&([F:SQH]PTE="" | [F:SQH]PTE=CZ)'     Endif
       ##Else
       ##   If [M]PTE<>"" FILGAUSUP(0)+='&([F:SQH]PTE="" | [F:SQH]PTE=[M]PTE)' Endif
       ##Endif
       If [M]PTE<>"" FILGAUSUP(0)+='&([F:SQH]PTE="" | [F:SQH]PTE=[M]PTE)' Endif
       If func AFNC.ACTIV("LTA") & [F:CPY]SSTTAXACT = 2 : FILGAUSUP(0)+='&[F:SQH]SSTENTCOD=[M]SSTENTCOD' : Endif # LTA.n  79065   # 106867.n
       # If func AFNC.ACTIV("LTA") & GLOCUSATAX : FILGAUSUP(0)+='&[F:SQH]SSTENTCOD=[M]SSTENTCOD' : Endif # LTA.n  79065   # 106867.o
    Endif
    
    # Le devis doit être valide
    FILGAUSUP(1) = '&([F:SQH]VLYDAT=[0/0/0] | [F:SQH]VLYDAT >= date$)'
    
    # Le devis ne doit pas être transformées
    FILGAUSUP(1) += '& [F:SQH]QUOSTA <> 3'
    
    # Le devis doit être signé
    FILGAUSUP(1) += '& [F:SQH]APPFLG > 2'
    
    # Issue 110706
    ##  Les Lignes ne doivent pas être des composants
    #FILGAUSUP(1) += '&(find([F:SQD]LINTYP,1,2,6,10))'
    #  Les Lignes ne doivent pas être des composants kit/sous-traité
    FILGAUSUP(1) += '& !find([F:SQD]LINTYP,3,4,5,11,12,13)'
    # End issue 110706
    
    # Issue 120966
    # Free product have to be con,siderated
    ##  Les Lignes ne doivent pas être des gratuits liés à une ligne (on prend les gratuits de groupé)
    ##FILGAUSUP(1) += '& [F:SQD]FOCFLG<>3'
    #FILGAUSUP(1) += '& [F:SQD]ORILIN=0'
    # End issue 120966
    
    If [M]NBLIG <> 0
       ##VPO 05/05/09 51742 pb listes gauches et CZ (modif FILGAUCHE et APRES_MODIF)
       ##If COUZON="PRITYP"
    #     If CZ<>""        FILGAUSUP(1)+='&[F:SQH]PRITYP=val(CZ)'     Endif
       ##   If val(CZ)<>0    FILGAUSUP(1)+='&[F:SQH]PRITYP=val(CZ)'     Endif
       ##Else
       ##   If [M]PRITYP<>0  FILGAUSUP(1)+='&[F:SQH]PRITYP=[M]PRITYP'   Endif
       ##Endif
       If [M]PRITYP<>0  FILGAUSUP(1)+='&[F:SQH]PRITYP=[M]PRITYP'   Endif
    
       ##VPO 05/05/09 51742 pb listes gauches et CZ (modif FILGAUCHE et APRES_MODIF)
       ##If COUZON="VACBPR"
       ##   If CZ<>""        FILGAUSUP(1)+='&[F:SQH]VACBPR=CZ'          Endif
       ##Else
       ##   If [M]VACBPR<>"" FILGAUSUP(1)+='&[F:SQH]VACBPR=[M]VACBPR'   Endif
       ##Endif
       If [M]VACBPR<>"" FILGAUSUP(1)+='&[F:SQH]VACBPR=[M]VACBPR'   Endif
    Endif
    
    If [M]NBLIG > 0 | ([M]NBLIG = 0 & [M]PJT <> "")
         # FGR 01/12/2011 : X3SUIVI71065 (début)
       If GPJTSNGDOC = G_OUI Then
         FILGAUSUP(1)+='&[F:SQH]PJT=[M]PJT'
       Endif
       # FGR 01/12/2011 : X3SUIVI71065 (fin)
    Endif
    
    # FGR 23/02/2015 : X3SUIVI104383 (début)
    FILGAUSUP(2) = "& ([F:SQH]SOHTYP = '' or [F:SQH]SOHTYP = [M:SOH0]SOHTYP)"
    # FGR 23/02/2015 : X3SUIVI104383 (fin)
    
    # X3-65724 (LC-14/02/18)   Filter in left picking list and row permission
    #GBIDC3="" : Call FILROLE("SQH",GBIDC3) From SUBARL
    #If GBIDC3<>"" FILGAUSUP(3)= "& " + GBIDC3 : Endif
    # Raz FILSUITE,IFILSUITE # X3-88182 (LCC-06/08/18) Pagination on invoice picking list
    Call AJOUTE_CONDITION_ROLE(FILSUITE,IFILSUITE,"SQH") From CRMUTIL150
    # END X3-65724 (LC-14/02/18)   Filter in left picking list and row permission
    
    Return
    
    ##########################################################################
    $AP_FILGAUCHE
    If currbox = GBOXSQ1
       WPICK=2 : Gosub RAFFRAICHI
    Endif
    Return
    
    ##########################################################################
    $DEB_PICK
    Local Integer I, J, WOK, SVGSTODIS, FUNCTION, NOL
    Local Decimal WQTY, WQTYSTU, WSTUDIS, WQTYPCE, WALLQTYPCE
    Local Char    SYMBOLE2(50)
    
    FUNCTION = 2  : # Identifiant commande pour TRTVENBOM
    
    Return
    
    #########################################################################
    $PICKE
    
    If REP=""
       If !CLECUR | !VERROU | !ACTMOD | GCONSULT OK=0
          Return
       Endif
    Endif
    
    Case currbox
     When GBOXSQ1 : Gosub SEL
    #                If [M]NBLIG=0
    #                   Actzo [M:SOH0]SOHTYP
    #                   Actzo [M:SOH0]SALFCY
    #                   Actzo [M:SOH0]BPCORD
    #                   Actzo [M:SOH2]STOFCY
    #                   If GUPDCUR=2 Actzo [M:SOH1]CUR Endif
    #                   If GNOTATI=2 Actzo [M:SOH1]PRITYP Endif
    #                Else
    #                   Diszo [M:SOH0]SOHTYP
    #                   Diszo [M:SOH0]SALFCY
    #                   Diszo [M:SOH0]BPCORD
    #                   If [M:SOH2]DME = 3
    #                      Diszo [M:SOH2]STOFCY
    #                   Else
    #                      Actzo [M:SOH2]STOFCY
    #                   Endif
    #                   Diszo [M:SOH1]CUR, PRITYP
    #                Endif
      When Default
    Endcase
    
    Return
    #########################################################################
    $DEPICK
    Case currbox
     When GBOXSQ1 : Gosub DESEL
                    Gosub SQH_MOINS From SUBSFIT
                    #If GERR <> 0 Then      # FGR 19/08/2014 : X3SUIVI100811
                    If GERR = 1 Then            # FGR 22/06/2015 : X3SUIVI109023
                      Return
                    Endif
    #                If [M]NBLIG=0
    #                   Actzo [M:SOH0]SOHTYP
    #                   Actzo [M:SOH0]SALFCY
    #                   Actzo [M:SOH0]BPCORD
    #                   Actzo [M:SOH2]STOFCY
    #                   If GUPDCUR=2 Actzo [M:SOH1]CUR Endif
    #                   If GNOTATI=2 Actzo [M:SOH1]PRITYP Endif
    #                Else
    #                   Diszo [M:SOH0]SOHTYP
    #                   Diszo [M:SOH0]SALFCY
    #                   Diszo [M:SOH0]BPCORD
    #                   If [M:SOH2]DME = 3
    #                      Diszo [M:SOH2]STOFCY
    #                   Else
    #                      Actzo [M:SOH2]STOFCY
    #                   Endif
    #                   Diszo [M:SOH1]CUR, PRITYP
    #                Endif
     When Default
    Endcase
    
    Return
    #########################################################################
    $FIN_PICK
    
    Call PJT_INFO_MSG() From TRTPJT   # FGR 15/12/2011 : X3SUIVI71065
    
    Call SQH_SOH_CALCUL From SUBSFIT
    
    # 101874 : V9 : Taxe code control
    # Valuation depends on SOHVALLIG parameter
    #If dim(GVALTTCSOH)>0 & dim(GVALTTC)>0 : GVALTTC=GVALTTCSOH : Endif
    #Call VALTTC ("GESSOH") From TRTVENFACR
    GVALTTC=GSOHVALLIG
    #If !GIMPORT : Call VALTTC ("GESSOH") From TRTVENFACR : Endif
    #---- Paramètres complementaires appel valorisation
    # PARAM_T(0) : Flag contrôle des taxes             (1=Non/2=Oui)
    # PARAM_T(1) : Lecture de la trace par le sous-pro (1=Non/2=Oui)
    # PARAM_T(2) : Flag retour                         (1=KO/2=OK)
    Local    Char     PARAM_T (25) (0..10)
    PARAM_T(0)="1"      : # Pas de contrôle des taxes
    PARAM_T(1)="1"      : # Pas de lecture de la trace
    PARAM_T(2)="0"
    Call VALTTC ("GESSOH", PARAM_T) From TRTVENFACR
    If PARAM_T(2)="1" GERR=1 : OK=0 : Endif
    # 101874
    
    If REP=""
        If !VERROU
            GMESSAGE=mess(10,100,1) : GERR=1 : OK=0 : Return
        Elsif !CLECUR | !ACTMOD | GCONSULT
            GMESSAGE=mess(9,123,1)  : GERR=1 : OK=0 : Return
        Endif
    Endif
    
    # ACA (2009-09-22) Lot S03 : chargement des sections des elts de fac des documents origine
    # 81878 : Ajout borne pour ne pas trier le tableau complet
    #Sorta [M:SFIT]NBTRF Order By [M:SFIT]DAC([S]indice)
    Sorta [M:SFIT]NBTRF [M:SFIT]NBTRF Order By [M:SFIT]DAC([S]indice)
    # 81878
    Call CHARG_CCE_MULTI(1,"[M:SFIT]VCRENT","[M:SFIT]DTA","[M:SIHV]XFNUM","[M:SIHV]SFICCE","[M:SIHV]DSP") From TRTX3CPT
    
    Case currbox
     When GBOXSQ1 : # Recherche du no devis origine de la commande
                    For I=0 To [M:SOH4]NBLIG-1
                        If [M:SOH4]DETSQHNUM(I)<>""
                            If [M:SOH3]SQHNUM=""
                                [M:SOH3]SQHNUM=[M:SOH4]DETSQHNUM(I)
                            Elsif [M:SOH3]SQHNUM<>[M:SOH4]DETSQHNUM(I)
                                Raz [M:SOH3]SQHNUM
                                Break
                            Endif
                        Endif
                    Next I
                    Affzo [M:SOH0]1-99
                    Affzo [M:SOH1]1-99
                    Affzo [M:SOH2]1-99
                    Affzo [M:SOH3]1-99
                    Affzo [M:SOH4]1-99
                    If [M]NBLIG=0
                       Actzo [M:SOH0]SOHTYP
                       Actzo [M:SOH0]SALFCY
                       Actzo [M:SOH0]BPCORD
                       Actzo [M:SOH2]STOFCY
                       If GUPDCUR=2 Actzo [M:SOH1]CUR Endif
                       If GNOTATI=2 Actzo [M:SOH1]PRITYP Endif
                    Else
                       Diszo [M:SOH0]SOHTYP
                       Diszo [M:SOH0]SALFCY
                       Diszo [M:SOH0]BPCORD
                       If [M:SOH2]DME = 3
                          Diszo [M:SOH2]STOFCY
                       Else
                          Actzo [M:SOH2]STOFCY
                       Endif
                       Diszo [M:SOH1]CUR, PRITYP
                    Endif
                    zonsui = "[M:SOH4]NBLIG("+num$(NOL)+")"
    When Default
    Endcase
    
    Return
    
    #########################################################################
    # Etiquettes de traitement                                              #
    #########################################################################
    $REMPBOX
    #-----------------------------------------------------------------------#
    # Remplissage des boites de picking                                     #
    #-----------------------------------------------------------------------#
    ILIS=val(right$(currbox,8))
    Gosub REMP_LISGAU From GOBJSUB
    
    #Case currbox
    # When GBOXSQ1 : Gosub FILGAUCHE
    #                IBOX=val(right$(GBOXSQ1,8))
    #                Gosub REMPLIT
    # When Default
    #Endcase
    
    Return
    
    #########################################################################
    #$REMPLIT
    #Case IBOX
    # When 1  : Gosub REMPLIT_1 From GESSOH
    # When 2  : Gosub REMPLIT_2 From GESSOH
    # When 3  : Gosub REMPLIT_3 From GESSOH
    # When 4  : Gosub REMPLIT_4 From GESSOH
    # When 5  : Gosub REMPLIT_5 From GESSOH
    # When 6  : Gosub REMPLIT_6 From GESSOH
    # When 7  : Gosub REMPLIT_7 From GESSOH
    # When 8  : Gosub REMPLIT_8 From GESSOH
    # When Default
    #Endcase
    #Return
    
    #########################################################################
    $SEL
    #-----------------------------------------------------------------------#
    # Sélection d'une ligne de devis                                        #
    #-----------------------------------------------------------------------#
    Local Integer WORI, WORILIN
    Local Char SWMESS(80)  # FGR 14/12/2011 : X3SUIVI71065
    
    # Issue X3-225092 - 2020-12-10 by SR : No picking if order generated on another site
    If [M:SOH0]ORIFCY<>"" & [M:SOH0]ORIFCY<>[M:SOH0]SALFCY
      GMESSAGE = mess(122,199,1)-":"-mess(862,196,1) : OK = 0 : Return
    Endif
    # End issue X3-225092
    
    
    #--- Lecture des tables [SOQ],[SOH]
    
    # Est-ce vraiement utile
    Read [SQD]SQD0=[F:SQD]SQHNUM;[F:SQD]SQDLIN
    If fstat
       Call RSTA ("SQD",[F:SQD]SQHNUM-num$([F:SQD]SQDLIN)) From GLOCK : OK=0 : Return
    Endif
    # Vérif. si la ligne n'a pas été transformée depuis le dernier raffraichissement de la liste de picking
    If [F:SQD]ORDQTY >= [F:SQD]QTY
        GMESSAGE = [F:SQD]SQHNUM-":"-mess(27,159,1)-[F:SQD]ITMREF-":"-mess(246,192,1) : OK=0 : Return
    Endif
    Read [SQH]SQH0=[F:SQD]SQHNUM
    If fstat
       Call RSTA ("SQH",[F:SQH]SQHNUM) From GLOCK : OK=0 : Return
    Endif
    # Issue X3-140596 - 2019-07-01 by ANKUL -> Block the conversion of unsigned documents - GESSQH
    If func AFNC.ACTIV("KPO")> 0 and func PORLEGLIB.PORLEG([F:SQH]SALFCY,"") =1 and func PORLEGLIB.DIGSIGN([F:SQH]SALFCY, "")
      If [F:SQH]SQHCFMFLG <> 2
        GMESSAGE = func AFNC.MES1(mess(297,7711,1), [F:SQH]SQHNUM)
        OK=0 : Return
      Endif
    Endif
    # Issue X3-140596 end
    #---  Alimentation flag inter-site et inter-société
    Call ALIBETCPY(2,[F:SQH]SALFCY,[F:SQH]BPCORD,[F:SQH]BPAADD,[M:SOH0]POHFCY,[M:SOH0]BPSNUM,[M:SOH1]BETFCY,[M:SOH1]BETCPY) From TRTVENISOC
    # --> Refuser les commandes à facturation directe si commande intra-société
    If [M:SOH0]SOHCAT=3 & [M:SOH1]BETFCY=2 & [M:SOH1]BETCPY<=1
        OK=0: GERR=1 : GMESSAGE=mess(256,192,1): Return :
    Endif
    # --> Commande inter-site :
    #     Le client commande est aussi le fsseur (correspond au site de vente)
    If [M:SOH1]BETFCY=2 & [F:SQH]BPCORD=[M:SOH0]BPSNUM
        Local Integer WOK : WOK=1
        Call AVERTIR (mess(151,191,1), WOK)From GESECRAN
        If WOK=1  GERR=1 : OK=0 : Return : Endif
    Endif
    # ---  Controler que le client n'est pas prospect
    If [F:BPC]BPCNUM <> [F:SQH]BPCORD
       Read [BPC]BPC0=[F:SQH]BPCORD
       If fstat Raz [F:BPC] Endif
    Endif
    If [F:BPC]BPCTYP = 4
       GMESSAGE=[F:SQH]SQHNUM-"-"-[F:SQH]BPCORD-mess(113,191,1)-"\"-mess(115,191,1)
       GORITRFBPP=[F:SQH]SQHNUM
       OK=0 : GERR=1
       SUIZON="BPCORD"
       Return
    Endif
    
    #--  Jde 2011-06-23 X3Suivi 74109 : Contrôler que le client n'est inactif ou bloqué #
    If [F:BPC]BPCSTA<>2
       OK=0 : GERR=1
       GMESSAGE=[F:SQH]SQHNUM-[F:SQH]BPCORD+"\"+mess(4,119,1) : # Client inactif
       SUIZON="BPCORD"
       Return
    Endif
    
    # -------------------------------------
    # FGR 16/01/2015 : X3SUIVI88435 (début)
      If [M:SOH0]SOHCAT = 2 Then
        Call C_BPCORD([F:SQH]BPCORD) From TRTVENCDE
        If mkstat = 2 Then
          OK = 0
          GERR = 1
          GMESSAGE -= "(" + mess(12,159,1) - ":" - [F:SQH]BPCORD + ")"
          SUIZON = "BPCORD"
          Return
        Endif
        # ---------------------------------
        Local Integer WLND
        Local Integer WBETFCY
    
        WLND = [F:TSO]SOHCAT
        WBETFCY = [M:SOH1]BETFCY
        Gosub CTR_LNDBETFCY From SUBSOHB
        If mkstat = 2 Then
          OK = 0
          GERR = 1
          GMESSAGE -= "(" + mess(12,159,1) - ":" - [F:SQH]BPCORD + ")"
          SUIZON = "BPCORD"
          Return
        Endif
        # ---------------------------------
        Local Char WSTOFCY(GLONFCY)
    
        If [F:BPD]BPCNUM <> [F:SQH]BPCORD or [F:BPD]BPAADD <> [F:SQD]BPAADD Then
          Read [BPD]BPD0=[F:SQH]BPCORD;[F:SQD]BPAADD
          If fstat Then Raz [F:BPD] : Endif
        Endif
        If [F:BPD]STOFCY <> "" Then
          WSTOFCY = [F:BPD]STOFCY
        Else
          WSTOFCY = GFCYDEF(7)
        Endif
        #
        Gosub CTR_LOC From SUBSOHB
        If mkstat = 2 Then
         OK = 0
         GERR = 1
         GMESSAGE -= "(" + mess(12,159,1) - ":" - [F:SQH]BPCORD - "-" - [F:SQD]BPAADD + ")"
         SUIZON = "BPCORD"
         Return
        Endif
      Endif
    # FGR 16/01/2015 : X3SUIVI88435 (fin)
    # -------------------------------------
    
    #--  Jde  X3Suivi 81719 --#
    #If [F:BPC]OSTCTL=3
    #   OK=0 : GERR=1
    #   GMESSAGE=[F:SQH]SQHNUM-[F:SQH]BPCORD+"\"+mess(2,178,1) : # Client bloqué
    #   SUIZON="BPCORD"
    #   Return
    # Endif
    
    # --- Contrôle que l'adresse de livraison est bien référencée chez le client : Cas où prospect transformé en client
    # --- Si on ne vient pas du picking devis, on créé uniquement l'adresse de livraison liée à l'adresse par défaut
    If [F:SQD]BPAADD <> ""
        Read [BPD]BPD0 = [F:SQD]BPCORD;[F:SQD]BPAADD
        If fstat
            GMESSAGE=mess(42,191,1)-":"-[F:SQD]BPCORD-[F:SQD]BPAADD-":"-mess(300,192,1)-"\"-mess(301,192,1) : OK=0 : GERR=1 : Return
        Elsif [F:BPD]ENAFLG<>2
            GMESSAGE=mess(42,191,1)-":"-[F:SQD]BPCORD-[F:SQD]BPAADD-":"-mess(2,126,1) : OK=0 : GERR=1 : Return
        Endif
    # Issue X3-113087 - 2019-03-18 by SR : no Ship to customer address in the Quote line : Is a ship to customer address exist ?
    Else
      Raz GERR
      OK = 1
      Filter [F:BPD] Where BPCNUM = [F:SQD]BPCORD & ENAFLG = 2
      Read [F:BPD]BPD0 First
      If fstat
        # No Ship To Customer address : Error message and no creation of Sales Order document
        GMESSAGE = mess(42,191,1)-":"-[F:SQD]BPCORD -":"- mess(154,192,1)
        OK = 0
        GERR=1
      Endif
      Filter [F:BPD]
      If OK = 0 : Return : Endif
    # End issue X3-113087
    Endif
    Raz GORITRFBPP
    #--- Contrôle de la devise
    OK=1
    Local Char WNEWCUR : WNEWCUR=[F:SQH]CUR
    If [F:SQH]CUR <> GEURO & ([M:SOH0]CUR = GEURO | [M]NBLIG = 0)
        If !find([F:SQH]SQHNUM, [M]DETSQHNUM(0..[M]NBLIG-1))
            Local Char WDEVISE : Local Date WDAT : Local Integer WOK
            WDEVISE=[F:SQH]CUR:WDAT=[M:SOH0]ORDDAT
            Gosub CTLDEVISEIN From CONTX3
            If WOK <> 0
                Case WOK
                    When 1 : GMESSAGE=mess(95,107,1) : # Attention saisie en devise "in"
                             OK=2: Call OUINON(GMESSAGE-"\"-mess(458,196,1),OK) From GESECRAN
                    When 2 : GMESSAGE=mess(94,107,1) : # La devise est "in" interdite
                             OK=2: Call AVERTIR(GMESSAGE-"\"-mess(458,196,1),OK) From GESECRAN
                    When 3 : # La devise est "in" et disparue
                             GMESSAGE=[F:SQH]CUR-":"-mess(457,196,1)-format$("D:"+GFMDAT4,[F:TCU]CURENDDAT)
                             OK=2: Call AVERTIR(GMESSAGE-"\"-mess(458,196,1),OK) From GESECRAN
                Endcase
                If OK=2 WNEWCUR=GEURO Endif
                If OK=1 & WOK > 1 OK=0 : Return : Endif
                OK=2
            Endif
            Default File [SOH]
        Else
    #        On a déjà pické des lignes sur ce devis
            WNEWCUR=[M:SOH0]CUR
        Endif
    Endif
    # Devises différentes attention
    If OK <> 2 & [M]NBLIG=0 & [M:SOH0]CUR <> "" & WNEWCUR <> [M:SOH0]CUR
        OK=2:GMESSAGE=[F:SQH]SQHNUM-mess(27,159,1)-[F:SQD]ITMREF+"\"+mess(228,192,1)+"\"+mess(205,100,1)
        Call AVERTIR(GMESSAGE, OK) From GESECRAN
        If OK=1 OK=0 : Return : Endif
    Endif
    #--- Alimentation des paramètres
    If [M:SOH0]SALFCY = ""
       ## alim. GSOCIETE,GFINRSP,GLOCALDEV
       #Call GETDEV([F:SQH]SALFCY) From DEVSUB
       If GFCY<>[F:SQH]SALFCY
           # Chargement globales référenciels, comptes et sections de la société
           GFCY=[F:SQH]SALFCY : Gosub CHARG_PARAM From SUBSOHA
       Endif
       # alim. gest avance(GEARMGT), acompte non versé(GLOKORD), ctl en-cours(GOSTCTL)
       Call GLOBVAR([F:SQH]SALFCY,"VEN") From TRTX3
    Endif
    #--- Lecture des tables articles
    Gosub LEC_TABART
    Local Integer RET
    #--- Controler que l'article-site existe
    If [F:ITM]STOMGTCOD <> 1
        Call CONTITF([F:SQD]ITMREF, [F:SQD]STOFCY, [F:ITM]STOMGTCOD) From TRTVENCTL
        If mkstat=2
            GERR=1:GMESSAGE=[F:SQH]SQHNUM-mess(27,159,1)-[F:SQD]ITMREF-mess(25,192,1)-[F:SQD]STOFCY
            OK=0: Return
        Endif
        # Si commande inter-site, vérifier que l'article-site de réception existe
        If [M:SOH1]BETFCY=2 & [M:SOH0]SOHCAT<>3 & [F:ITM]RCPFLG=2
            If [F:BPD]BPCNUM<>[F:SQH]BPCORD | [F:BPD]BPAADD<>[F:SQD]BPAADD
               Read [BPD]BPD0=[F:SQH]BPCORD;[F:SQD]BPAADD
               If fstat Raz [F:BPD] Endif
            Endif
            If [F:BPD]RCPFCY<>""
                Call CONTITF([F:SQD]ITMREF, [F:BPD]RCPFCY, [F:ITM]STOMGTCOD) From TRTVENCTL
                If mkstat=2
                    GERR=1:GMESSAGE=mess(74,187,1)-":"-[F:SQD]ITMREF-mess(293,192,1)-[F:BPD]RCPFCY
                    OK=0: Return
                Endif
            Endif
        Endif
        # Si commande à facturation directe inter-site, l'article ne doit pas être réceptionné
        # Issue 113089/130 - 2016-10-14 by SR : Message 269,194 remplacé par 578,194
        If [M:SOH0]SOHCAT=3 & [M:SOH1]BETFCY=2
            If [F:ITM]RCPFLG=2
                GERR=1: GMESSAGE=[F:SQD]ITMREF-":"-mess(98,197,1)-mess(3,446,1)-mess(578,194,1) : OK=0 :
                Return
            Endif
        Endif
    Endif
    
    # -------------------------------------
    # FGR 16/01/2015 : X3SUIVI88435 (début)
      # --> Etape n°5 : Si cde de prêt, l'article doit etre géré en pret
      If [M:SOH0]SOHCAT = 2 Then
        If [F:ITF]ITMREF <> [F:SQD]ITMREF Then  # FGR 10/02/2015 : X3SUIVI106129 slt si nécessaire
          Read [ITS]ITS0=[F:SQD]ITMREF
          If fstat Then Raz [F:ITS] : Endif
        Endif
        If [F:ITS]LNDFLG = 1
          GMESSAGE=mess(34,192,1) - "(" + mess(28,159,1) - ":" - [F:SQD]ITMREF + ")"
          OK=0
          Return
        Endif
        # --> Etape n°5 : Si cde de prêt et article géré en stock, il doit être géré en emplacement
        If [F:ITM]STOMGTCOD <> 1
          #If [F:ITF]ITMREF <> [F:SQD]ITMREF | [F:ITF]STOFCY <> [M:SOH4]DSTOFCY(NOL)    # FGR 10/02/2015 : X3SUIVI106129
          #  Read [ITF]ITF0=[F:ITM]ITMREF;[M:SOH4]DSTOFCY(NOL)                          # FGR 10/02/2015 : X3SUIVI106129
          If [F:ITF]ITMREF <> [F:SQD]ITMREF | [F:ITF]STOFCY <> [F:SQD]STOFCY            # FGR 10/02/2015 : X3SUIVI106129
            Read [ITF]ITF0=[F:ITM]ITMREF;[F:SQD]STOFCY                                  # FGR 10/02/2015 : X3SUIVI106129
            If fstat Raz [F:ITF] : Endif
          Endif
          If [F:ITF]STOMGTCOD>1 & [F:ITF]LOCMGTCOD <> 2
            GMESSAGE = mess(119,192,1) - "(" + mess(27,159,1) - ":" - [F:SQD]ITMREF + ")"
            OK=0
            Return
          Endif
        Endif
      Endif
    # FGR 16/01/2015 : X3SUIVI88435 (fin)
    # -------------------------------------
    
    # Qté commandée = qté restant à commandée
    Local Decimal WCOEF
    WQTY    = [F:SQD]QTY - [F:SQD]ORDQTY
    
    #---------------------------------------------------------------------#
    # Point d'entree modification de la quantité commandée                #
    #---------------------------------------------------------------------#
    Local Integer WPE_OK : WPE_OK=1
    GPOINT="MODSOQQTY" : Gosub ENTREE From EXEFNC
    If WPE_OK=0 : OK=0 : Return Endif
    
    #--- Appel au traitement de contrôle de la sélection
    # C'est le 1ér devis de la commande
    If [M:SOH4]NBLIG <> 0
       #CPO 62810 - pb découvert lors du ttt de cette fiche (en fait correction comme le 68235)
       #If sum([M:SOH4]DETSQHNUM(0..[M:SOH4]NBLIG-1)) = ""
       If sigma(0,[M:SOH4]NBLIG-1,[M:SOH4]DETSQHNUM(indcum)) = ""
          YSQHNUM     = [F:SQH]SQHNUM
       Endif
    Endif
    
    # C'est la première ligne de la commande
    If [M]NBLIG = 0 & find(GREP, "C", "D")
       # Issue X3-160406 - 2019-10-11 by SR : If BPCORD not already loaded
       If [M:SOH0]BPCORD = ""
          Local Shortint RES : Raz RES
          Call CTLBPCSTA([F:SQH]BPCORD,1,RES) From TRTVENCTL
          If RES = 1 : GERR=1 : OK=0 : Return : Endif
       Endif
       # End issue X3-160406
       # Alimentation des masques (entête)
       Call ALISQHSOH(WNEWCUR) From TRTVENCDE
       YSQHNUM = [F:SQH]SQHNUM
       # X3-66571 (LCC 19-02-18) Message of warning missing
       If [M:SOH0]CUSORDREF<>"" & GFONC1<>"GESSQH"
          If !clalev([SOH]): Local File SORDER: Endif
          Look [SOH]SOH1=[M:SOH0]BPCORD;[M:SOH0]CUSORDREF
          If !fstat
            Local Integer WOK : WOK=2
            Call AVERTIR (mess(80,191,1), WOK) From GESECRAN
            If WOK=1 : GERR=1 : OK = 0: Return : Endif
          Endif
       Endif
       # End X3-66571 (LCC 19-02-18) Message of warning missing
    Else
       # Contrôle des conditions des regroupement
       Gosub CTL_DEVIS
       If OK=0 Return Endif
    Endif
    
    
    # Contrôle de l'insertion
    If [M:SOH4]NBLIG+1 >= dim([M:SOH4]ITMREF)-1
       GERR=1 : GMESSAGE=mess(122,199,1)
       OK=0   : Return
    Endif
    SYMBOLE2 = "SQH"+[F:SQH]SQHNUM
    Lock = SYMBOLE2
    If fstat
       # modification en cours sur un autre poste
       GERR=1 : GMESSAGE=[F:SQH]SQHNUM-":"-mess(10,100,1)
       OK=0   : Return
    Endif
    
    # FGR 24/11/2011 : X3SUIVI71065 : (début)
    If func TRTPJT.IS_PJT_AVAILABLE([F:SQD]PJT, "[M:SOH4]DPJT", SWMESS) = G_NON Then
      Call PJT_ADD_MSG([F:SQD]PJT, SWMESS) From TRTPJT
      GERR = 1
      OK = 0
      Return
    Endif
    # FGR 24/11/2011 : X3SUIVI71065 : (fin)
    
    #--- La sélection est correcte
    
    # Ouverture de la ligne
    nolign = [M:SOH4]NBLIG
    Insa nolign,1,[M:SOH4]NBLIG [M:SOH4]NBLIG
    [M:SOH4]NBLIG += 1
    nolign = [M:SOH4]NBLIG
    NOL = nolign-1
    status = 0
    
    # Alimentation de la classe [M:SOH4] de la ligne
    Call ALISQDSOH(NOL,WQTY) From TRTVENCDE
    
    If GERR=1
        OK=0 : Return
    Endif
    
    Call LINNUM("SOPLIN") From TABLEAUX
    
    Gosub SQH_SOH_PLUS From SUBSFIT
    #If GERR <> 0 Then  # FGR 19/08/2014 : X3SUIVI100811
    If GERR = 1 Then            # FGR 22/06/2015 : X3SUIVI109023
      OK = 0
      Return
    Endif
    
    # --- Si Initialisation de la qté à allouer, Dde d'utilisation des réservations clients
    If [M]WALLQTY(NOL)>0 & GUSERERBPC=3
        [M]RERBPCFLG(NOL)=1
        Local Char WVCRRER
        Local Decimal WALLCLI
        WVCRRER= vireblc(format$("K:"+num$(GLONBPC)+"X",[M]BPCORD)+format$("K:"+num$(GLONBPD)+"X",[M]DBPAADD(NOL)), 1)
        #--- Bug 65986
        #Call CAL_RERQTY(1,[M]ITMREF(NOL),[M]DSTOFCY(NOL),WVCRRER,WALLCLI) From STKALL
        Call CAL_RERQTY(1,[M]ITMREF(NOL),[M]DSTOFCY(NOL),WVCRRER,[M]DSHIDAT(NOL),WALLCLI) From STKALL
        #---
    
        If WALLCLI <> 0
            GMESSAGE = mess(207,191,1)-":"-num$([M]WALLQTY(NOL))-[M]SAU(NOL)-"\"-mess(131,191,1)-num$(WALLCLI)-[M]STU(NOL)
            OK=2 : Call OUINON (GMESSAGE-"\"-mess(130,191,1),OK) From GESECRAN
            If OK = 2 [M]RERBPCFLG(NOL)=2 : Endif
        Endif
    Endif
    
    # Conversion des montants si nécessaire
    If [F:SQH]CUR <> [M:SOH1]CUR
        Local Char    WANCCUR : WANCCUR=[F:SQH]CUR
        Local Decimal MNTORI, MNTDES
        Local Integer I, SPSTAT
        Call CONVERT2(WANCCUR, [M:SOH1]CUR, GLOCALDEV, [M]CHGTYP, date$, [M]GROPRI(NOL), MNTDES, SPSTAT) From TRTDEV
        [M]GROPRI(NOL) = arr(MNTDES, 10^-GDECPRI)
        For I = 1 To 9
            If evalue ("dim([m:soh4]discrgval"+num$(I)+"(nol))")>0
                If GFMTREM(I-1)="M"
                    MNTORI = evalue("[m:soh4]discrgval"+num$(I)+"(NOL)")
                    Call CONVERT(WANCCUR, [M:SOH1]CUR, GLOCALDEV, [M]CHGTYP, date$, MNTORI, MNTDES, SPSTAT) From TRTDEV
                    Assign "[m:soh4]discrgval"+num$(I)+"(NOL)" With MNTDES
                Endif
            Endif
        Next
        Call CONVERT2(WANCCUR, [M:SOH1]CUR, GLOCALDEV, [M]CHGTYP, date$, [M]CPRPRI(NOL), MNTDES, SPSTAT) From TRTDEV
        [M]CPRPRI(NOL) = arr(MNTDES, 10^-GDECPRI)
    Endif
    
    # Calculs prix net, marge et maj montants livrés et poids
    GNETMAR=0
    Call ALICLCAMT([M:SOH4]ITMREF(NOL), [M:SOH4]QTY(NOL), NOL, "SOH4", [M:SOH4]CLCAMT1(NOL), [M:SOH4]CLCAMT2(NOL)) From TRTX3
    Call CLCNETPRI([M:SOH4]QTY(NOL),[M:SOH1]CUR, NOL)From TRTVENPRI
    Call CLCPFM([M:SOH4]DSTOFCY(NOL),[M:SOH1]PRITYP,[M:SOH0]CHGTYP,[M:SOH0]ORDDAT,[M:SOH1]CUR,NOL,1) From TRTVENPRI
    #--CPO 83036 suite à la correction 79343 j'ai dupliqué l'appel à APRES_LIGNE !
    #Call APRES_LIGNE(NOL,0) From SUBSOHB
    #--/CPO
    #--CPO 79343 Pb identifié lors du ttt de cette fiche
    #--Avant appel APRES_LIGNE il faut positionner le GMODIF sinon on se retrouve avec des
    #--valeurs qui viennent des actions faites avant le pick
    #--(exp si suppr ligne GMODIF=1, si création GMODIF=2 et si modif ligne GMODIF=0)
    GMODIF=2 :#--CPO 79343 Ne pas oublier de le RAZ en fin de $SEL !
    Call APRES_LIGNE(NOL,0) From SUBSOHB
    #--CPO 79343
    If GREP<>"C" and GSOHSUPPLIGDSP<>999999
      Local Integer WTEMPDSP : Raz WTEMPDSP
      Call CTLSUPP_EXISTDSP("SOH",NOL,WTEMPDSP) From TRTVENDIV
      If WTEMPDSP=1
        GSOHSUPPLIGDSP +=1
      Endif
    Endif
    #--/CPO
    GNETMAR=1
    
    nolign  = NOL+1
    
    # A vérifier
    
    # Sauvegarde qté devis et qté à commandée du composé
    WDEVQTYCPE = [F:SQD]QTY
    # qté commandée
    WORDQTY    = WQTY
    # Si composé de kit
    WORI=NOL
    WORILIN = [F:SQD]SQDLIN
    # Issue 110706
    #If find([M:SOH4]LINTYP(NOL),2,6,10)
    If find([M:SOH4]LINTYP(NOL),2,10)
    # End issue 110706
       If !clalev([F:SQD1]) Local File SQUOTED [SQD1] Endif
       Filter [SQD1] Where SQHNUM = [F:SQD]SQHNUM & SQDLIN > [F:SQD]SQDLIN
       For [SQD1]
          If ([M:SOH4]LINTYP(WORI)=2  & find([F:SQD1]LINTYP,3,4,5)) |
    &        ([M:SOH4]LINTYP(WORI)=10 & find([F:SQD1]LINTYP,11,12,13))
    # Issue 110706
    #&        ([M:SOH4]LINTYP(WORI)=6  & find([F:SQD1]LINTYP,7,8,9)) |
    # End issue 110706
             [F:SQD] = [F:SQD1]
             # Lecture des tables articles
             Gosub LEC_TABART
             # Contrôle de l'insertion
             If [M:SOH4]NBLIG+1 >= dim([M:SOH4]ITMREF)-1
                GERR=1 : GMESSAGE=mess(122,199,1)  # FGR 22/06/2015 : X3SUIVI109023 pas GERR=2
                Break
             Endif
             Gosub SQH_SOH_PLUS From SUBSFIT
             #If GERR <> 0 Then  # FGR 19/08/2014 : X3SUIVI100811
             If GERR = 1 Then            # FGR 22/06/2015 : X3SUIVI109023
               OK = 0
               Break
             Endif
             # Ouverture de la ligne
             Insa nolign,1,[M:SOH4]NBLIG [M:SOH4]NBLIG
             [M:SOH4]NBLIG += 1
             nolign = [M:SOH4]NBLIG
             NOL = nolign-1
             status = 0
             # Calcul de la quantité commandée du composant
             WQTY = (WORDQTY * [F:SQD]QTY) / WDEVQTYCPE
             # Alimentation de la classe [M:SOH4] de la ligne
             Call ALISQDSOH(NOL,WQTY) From TRTVENCDE
             Call LINNUM("SOPLIN") From TABLEAUX
             # Conversion des montants si nécessaire
             If [F:SQH]CUR <> [M:SOH1]CUR
                 Local Char    WANCCUR : WANCCUR=[F:SQH]CUR
                 Local Decimal MNTORI, MNTDES
                 Local Integer I, SPSTAT
                 Call CONVERT2(WANCCUR, [M:SOH1]CUR, GLOCALDEV, [M]CHGTYP, date$, [M]GROPRI(NOL), MNTDES, SPSTAT) From TRTDEV
                 [M]GROPRI(NOL) = arr(MNTDES, 10^-GDECPRI)
                 For I = 1 To 9
                     If evalue ("dim([m:soh4]discrgval"+num$(I)+"(nol))")>0
                         If GFMTREM(I-1)="M"
                             MNTORI = evalue("[m:soh4]discrgval"+num$(I)+"(NOL)")
                             Call CONVERT(WANCCUR, [M:SOH1]CUR, GLOCALDEV, [M]CHGTYP, date$, MNTORI, MNTDES, SPSTAT) From TRTDEV
                             Assign "[m:soh4]discrgval"+num$(I)+"(NOL)" With MNTDES
                         Endif
                     Endif
                 Next
                 Call CONVERT2(WANCCUR, [M:SOH1]CUR, GLOCALDEV, [M]CHGTYP, date$, [M]CPRPRI(NOL), MNTDES, SPSTAT) From TRTDEV
                 [M]CPRPRI(NOL) = arr(MNTDES, 10^-GDECPRI)
             Endif
             # Calculs prix net, marge et maj montants livrés et poids
             GNETMAR=0
             Call ALICLCAMT([M:SOH4]ITMREF(NOL), [M:SOH4]QTY(NOL), NOL, "SOH4", [M:SOH4]CLCAMT1(NOL), [M:SOH4]CLCAMT2(NOL)) From TRTX3
             Call CLCNETPRI([M:SOH4]QTY(NOL),[M:SOH1]CUR, NOL)From TRTVENPRI
             Call CLCPFM([M:SOH4]DSTOFCY(NOL),[M:SOH1]PRITYP,[M:SOH0]CHGTYP,[M:SOH0]ORDDAT,[M:SOH1]CUR,NOL,1) From TRTVENPRI
             Call APRES_LIGNE(NOL,0) From SUBSOHB
             GNETMAR=1
             nolign = NOL+1
          Else
             Break
          Endif
       Next
       Filter [SQD1]
       Close Local File [SQD1]
       Default File [SOH]
       # Bug 62932 : Si kit géré en ctm directe, ts les composants doivent être gérés en ctm directe
       If [M:SOH4]LINTYP(WORI)=2 & [M:SOH4]FMI(WORI)=2
           Local Integer WFMICPE : WFMICPE = [M]FMI(WORI)
           # Vérif que ts les composants sont gérés en ctm (FMI=2 ou 3)
           Local Integer ORI : ORI=WORI
           Gosub VERIF_KIT_CTM From TRTVENBOM
           If WFMICPE=2
               # Ts les composants sont gérés en ctm (FMI=2 ou 3), on force la ctm directe FMI=2 pour ts les composants :
               # Kit et composants sont gérés en ctm directe
               Gosub MOD_KIT_CTM From TRTVENBOM
           Else
               # Ts les composants ne sont pas gérés en ctm (FMI=2 ou 3), on force la ctm receptionnée FMI=3 pour le composé :
               # Le Kit est géré en ctm receptionnée, les composants sont gérés sur stock
               [M]FMI(WORI)=3
               [M:SOH4]STOMGTCOD(WORI)=[M:SOH4]YSTOMGTCOD(WORI)
           Endif
       Endif
       # Bug 62932
    Endif
    
    # Issue 120966
    ## Free product are not automatically generated with the parent product
    ## Si origine gratuit
    #If [M:SOH4]FOCFLG(WORI)=2
    #   WORI=NOL
    #   If !clalev([F:SQD1]) Local File SQUOTED [SQD1] Endif
    #   Filter [SQD1] Where SQHNUM=[F:SQD]SQHNUM & SQDLIN>[F:SQD]SQDLIN & ORDFLG<>2 & FOCFLG=3 & ORILIN=WORILIN
    #   For [SQD1]
    #       [F:SQD] = [F:SQD1]
    #       # Lecture des tables articles
    #       Gosub LEC_TABART
    #       # Contrôle de l'insertion
    #       If [M:SOH4]NBLIG+1 >= dim([M:SOH4]ITMREF)-1
    #           GERR=1 : GMESSAGE=mess(122,199,1)  # FGR 22/06/2015 : X3SUIVI109023 pas GERR=2
    #           Break
    #       Endif
    #
    #       Gosub SQH_SOH_PLUS From SUBSFIT
    #       #If GERR <> 0 Then     # FGR 19/08/2014 : X3SUIVI100811
    #       If GERR = 1 Then            # FGR 22/06/2015 : X3SUIVI109023
    #         Break
    #       Endif
    #       # Ouverture de la ligne
    #       Insa nolign,1,[M:SOH4]NBLIG [M:SOH4]NBLIG
    #       [M:SOH4]NBLIG += 1
    #       nolign = [M:SOH4]NBLIG
    #       NOL = nolign-1
    #       status = 0
    #       WQTY = [F:SQD1]QTY
    #       # Alimentation de la classe [M:SOH4] de la ligne
    #       Call ALISQDSOH(NOL,WQTY) From TRTVENCDE
    #       [M]ORILIN(NOL)  = [M]SOPLIN(WORI)
    #       Call LINNUM("SOPLIN") From TABLEAUX
    #       # Conversion des montants si nécessaire
    #       If [F:SQH]CUR <> [M:SOH1]CUR
    #           Local Char    WANCCUR : WANCCUR=[F:SQH]CUR
    #           Local Decimal MNTORI, MNTDES
    #           Local Integer I, SPSTAT
    #           Call CONVERT2(WANCCUR, [M:SOH1]CUR, GLOCALDEV, [M]CHGTYP, date$, [M]GROPRI(NOL), MNTDES, SPSTAT) From TRTDEV
    #           [M]GROPRI(NOL) = arr(MNTDES, 10^-GDECPRI)
    #           For I = 1 To 9
    #               If evalue ("dim([m:soh4]discrgval"+num$(I)+"(nol))")>0
    #                   If GFMTREM(I-1)="M"
    #                       MNTORI = evalue("[m:soh4]discrgval"+num$(I)+"(NOL)")
    #                       Call CONVERT(WANCCUR, [M:SOH1]CUR, GLOCALDEV, [M]CHGTYP, date$, MNTORI, MNTDES, SPSTAT) From TRTDEV
    #                       Assign "[m:soh4]discrgval"+num$(I)+"(NOL)" With MNTDES
    #                   Endif
    #               Endif
    #           Next
    #           Call CONVERT2(WANCCUR, [M:SOH1]CUR, GLOCALDEV, [M]CHGTYP, date$, [M]CPRPRI(NOL), MNTDES, SPSTAT) From TRTDEV
    #           [M]CPRPRI(NOL) = arr(MNTDES, 10^-GDECPRI)
    #       Endif
    #       # Calculs prix net, marge et maj montants livrés et poids
    #       GNETMAR=0
    #       Call ALICLCAMT([M:SOH4]ITMREF(NOL), [M:SOH4]QTY(NOL), NOL, "SOH4", [M:SOH4]CLCAMT1(NOL), [M:SOH4]CLCAMT2(NOL)) From TRTX3
    #       Call CLCNETPRI([M:SOH4]QTY(NOL),[M:SOH1]CUR, NOL)From TRTVENPRI
    #       Call CLCPFM([M:SOH4]DSTOFCY(NOL),[M:SOH1]PRITYP,[M:SOH0]CHGTYP,[M:SOH0]ORDDAT,[M:SOH1]CUR,NOL,1) From TRTVENPRI
    #       Call APRES_LIGNE(NOL,0) From SUBSOHB
    #       GNETMAR=1
    #       nolign = NOL+1
    #   Next
    #   Filter [SQD1]
    #   Close Local File [SQD1]
    #   Default File [SOH]
    #Endif
    # End issue 120966
    
    If COUZON="STOFCY" & CZ="" CZ=[M:SOH2]STOFCY Endif
    If COUZON="SALFCY" & CZ="" CZ=[M:SOH0]SALFCY Endif
    If COUZON="BPCORD" & CZ="" CZ=[M:SOH0]BPCORD Endif
    
    # Recherche du no devis origine de la commande
    #For I=0 To [M:SOH4]NBLIG-1
    #    If [M:SOH4]DETSQHNUM(I)<>""
    #        If [M:SOH3]SQHNUM=""
    #            [M:SOH3]SQHNUM=[M:SOH4]DETSQHNUM(I)
    #        Elsif [M:SOH3]SQHNUM<>[M:SOH4]DETSQHNUM(I)
    #            Raz [M:SOH3]SQHNUM
    #            Break
    #        Endif
    #    Endif
    #Next I
    #Affzo [M:SOH0]1-99
    #Affzo [M:SOH1]1-99
    #Affzo [M:SOH2]1-99
    #Affzo [M:SOH3]1-99
    #Affzo [M:SOH4]1-99
    
    #--CPO 79343 Pb identifié lors du ttt de cette fiche
    #--Avant appel APRES_LIGNE j'ai positionné le GMODIF=2, il faut le RAZ
    Raz GMODIF
    
    Raz GMESSAGE
    Return
    #########################################################################
    $DESEL
    #-----------------------------------------------------------------------#
    # Désélection d'une ligne de devis                                      #
    #-----------------------------------------------------------------------#
    
    Raz I,J
    OK = 0
    If [M:SOH4]NBLIG <> 0
       While OK <> 1
          I = find([F:SQD]SQHNUM,[M:SOH4]DETSQHNUM(J..[M:SOH4]NBLIG-1))
          If !I Break Endif
          If [M:SOH4]CREFLG(J+I-1)=0 & [F:SQD]SQDLIN=[M:SOH4]SQDLIN(J+I-1)
             # Maj montants livrés ,poids et suppression des textes
             GMODIF = 1
             NOL    = J+I-1
             Call AVANT_LIGNE(NOL) From SUBSOHB
             #--CPO 79343
             If GMODIF=1 and GREP<>"C" and GSOHSUPPLIGDSP>0 and GSOHSUPPLIGDSP<>999999
               Local Integer WTEMPDSP : Raz WTEMPDSP
               Call CTLSUPP_EXISTDSP("SOH",NOL,WTEMPDSP) From TRTVENDIV
               If WTEMPDSP=1
                 GSOHSUPPLIGDSP -=1
               Endif
             Endif
             #--/CPO
             # Si annulation origine gratuit alors suppression du gratuit
             If (GMODIF = 1 | GMODIF = 3 | GMODIF = 4) & GFOCFLG = 2
                Local Integer RET
                Call SUPGRA(NOL, FUNCTION, RET) From TRTVENBOM
             Endif
             # Si annulation composé kit ou nomenclature alors suppression des composants
             If GMODIF = 3 | GMODIF = 4
                NL = NOL+1
                Gosub SUPNOM From TRTVENBOM
             Endif
    
             Dela NOL,1,[M:SOH4]NBLIG-1 [M:SOH4]NBLIG
             [M:SOH4]NBLIG -= 1
    
    #         Affzo [M:SOH4]
             Raz GMESSAGE
             OK = 1
          Else
             J = J+I
          Endif
       Wend
    Endif
    
    Raz GMODIF
    
    #--CPO 76678 S'il n'y a plus de lignes d'un devis duquel on a repris la référence, il faut raz cette réference
    If [M:SOH4]NBLIG>0 and [M:SOH0]CUSORDREF=[F:SQH]CUSQUOREF
      If !find([F:SQD]SQHNUM,[M:SOH4]DETSQHNUM(0..[M:SOH4]NBLIG-1))
        Raz [M:SOH0]CUSORDREF : Affzo [M:SOH0]CUSORDREF
      Endif
    Endif
    #--CPO
    
    # Si suite à désélection de la ligne, il n'y a plus de ligne sélectionnée
    # sur ce devis, il faut le débloquer
    Raz I,J
    OK = 2
    If [M:SOH4]NBLIG <> 0
       While OK <> 1
          I = find([F:SQD]SQHNUM,[M:SOH4]DETSQHNUM(J..[M:SOH4]NBLIG-1))
          If !I Break Endif
          If [M:SOH4]CREFLG(J+I-1)=0
             OK = 1
          Else
             J = J+I
          Endif
       Wend
    Endif
    If OK = 2
    #  Unlock entête devis
       SYMBOLE2 = "SQH"+[F:SQD]SQHNUM
       Unlock = SYMBOLE2
    Endif
    
    Return
    #########################################################################
    $LEC_TABART
    #-----------------------------------------------------------------------#
    # Lecture des tables articles                                           #
    #-----------------------------------------------------------------------#
    If [F:ITM]ITMREF <> [F:SQD]ITMREF
       Read [ITM]ITM0=[F:SQD]ITMREF
       If fstat Raz [F:ITM] Endif
    Endif
    If [F:ITS]ITMREF <> [F:SQD]ITMREF
       Read [ITS]ITS0 = [F:SQD]ITMREF
       If fstat Raz [F:ITS] Endif
    Endif
    If ([F:ITU]ITMREF <> [F:SQD]ITMREF) | ([F:ITU]BPCNUM <> [F:SQH]BPCORD)
       Read [F:ITU]ITU0 = [F:SQD]ITMREF;[F:SQH]BPCORD
       If fstat Raz [F:ITU] Endif
    Endif
    Return
    #########################################################################
    $CTL_DEVIS
    #---------------------------------------------------------------------------------------#
    # Contrôle de la ligne devis sélectionnée                                               #
    # Elle doit être transformable et cohérente par rapport aux autres lignes sélectionnées #
    #---------------------------------------------------------------------------------------#
    Local Integer I
    
    For I=0 To [M]NBLIG-1
       If [F:SQD]SQHNUM=[M]DETSQHNUM(I) & [F:SQD]SQDLIN=[M]SQDLIN(I) & [M]CREFLG(I)=0
          OK=0 : GERR=1
          GMESSAGE=[F:SQH]SQHNUM-mess(27,159,1)-[F:SQD]ITMREF+"\"+mess(200,192,1)
          Break
       Endif
    Next I
    If OK=0 Return Endif
    
    #---------------------------------------------#
    #  Contrôler que le client n'est pas prospect #
    #---------------------------------------------#
    If [F:BPC]BPCNUM <> [F:SQH]BPCORD
       Read [BPC]BPC0=[F:SQH]BPCORD
       If fstat Raz [F:BPC] Endif
    Endif
    If [F:BPC]BPCTYP = 4
       OK=0 : GERR=1
       GMESSAGE=[F:SQH]SQHNUM-[F:SQH]BPCORD+"\"+mess(383,197,1)
       Return
    Endif
    
    #-----------------------------------------#
    #  Contrôle des critéres de regroupement  #
    #-----------------------------------------#
    If [F:SQH]BPCORD<>[M]BPCORD | (GLINBPD=1 & [F:SQD]BPAADD <> "" & [F:SQD]BPAADD<>[M]BPAADD)
       OK=0 : GERR=1
       GMESSAGE=[F:SQH]SQHNUM-mess(27,159,1)-[F:SQD]ITMREF+"\"+mess(196,192,1)+"\"+mess(102,192,1)
       Return
    Endif
    # Vérif.cohérence entre l'adr de liv entête cde et l'adr de liv ligne concernant les infos douanières et le régime de taxe
    If [F:SQD]BPAADD<>"" & [F:SQD]BPAADD<>[M]BPAADD
        If [M:SOH1]VACBPR<>[F:BPD]VACBPR & [F:BPD]VACBPR<>""
            # Régime de taxe devis XXX différent du régime de taxe entête commande YYY
            GMESSAGE=[F:SQH]SQHNUM-":"-mess(620,197,1)-mess(18,197,1)-mess(121,198,1)-"("-[F:BPD]VACBPR-")"-mess(621,197,1)-mess(620,197,1)-mess(622,197,1)-mess(191,198,1)-"("-[M:SOH1]VACBPR-")"
            OK=0 : GERR=1 : Return
        #--- CPO 72237 Le champ BPIEECNUM est soumis à code activité
        #Elsif [M:SOH0]BPIEECNUM<>[F:BPD]EECNUM & [F:BPD]EECNUM<>""
        Elsif dim([M:SOH0]BPIEECNUM)>0 & [M:SOH0]BPIEECNUM<>[F:BPD]EECNUM & [F:BPD]EECNUM<>""
            # N°identification CEE devis XXX différent du N°identification CEE entête devis
            GMESSAGE=[F:SQH]SQHNUM-":"-mess(629,197,1)-mess(18,197,1)-mess(121,198,1)-"("-[F:BPD]EECNUM-")"-mess(621,197,1)-mess(629,197,1)-mess(622,197,1)-mess(191,198,1)-"("-[M:SOH0]BPIEECNUM-")"
            OK=0 : GERR=1: Return
        Elsif [M:SOH0]EECICT<>[F:BPD]EECICT & [F:BPD]EECICT<>""
            # Code incoterm devis XXX différent du code incoterm entête devis
            GMESSAGE=[F:SQH]SQHNUM-":"-mess(630,197,1)-mess(18,197,1)-mess(121,198,1)-"("-[F:BPD]EECICT-")"-mess(621,197,1)-mess(630,197,1)-mess(622,197,1)-mess(191,198,1)-"("-[M:SOH0]EECICT-")"
            OK=0 : GERR=1: Return
        Elsif dim([M:SOH0]EECLOC)>0 & [M:SOH0]EECLOC<>[F:BPD]EECLOC & [F:BPD]EECLOC<>0
            # Lieu transport CEE devis différent du Lieu transport CEE entête devis
            GMESSAGE=[F:SQH]SQHNUM-":"-mess(631,197,1)-mess(18,197,1)-mess(121,198,1)-"("-mess([F:BPD]EECLOC,236,1)-")"-mess(621,197,1)-mess(631,197,1)-mess(622,197,1)-mess(191,198,1)-"("-mess([M:SOH0]
    & EECLOC,236,1)-")"
            OK=0 : GERR=1: Return
        Endif
    Endif
    
    If [F:SQH]SALFCY<>[M]SALFCY
       OK=0 : GERR=1
       GMESSAGE=[F:SQH]SQHNUM-mess(27,159,1)-[F:SQD]ITMREF+"\"+mess(196,192,1)+"\"+mess(103,192,1)
       Return
    Endif
    If [F:SQH]PLISTC<>[M]PLISTC
       OK=0 : GERR=1
       GMESSAGE=[F:SQH]SQHNUM-mess(27,159,1)-[F:SQD]ITMREF+"\"+mess(196,192,1)+"\"+mess(305,192,1)
       Return
    Endif
    If [F:SQH]CUR<>[M]CUR & ([F:TCU]EURFLG<>2 | [M]CUR <> WNEWCUR)
        OK=0 : GERR=1
        GMESSAGE=[F:SQH]SQHNUM-mess(27,159,1)-[F:SQD]ITMREF+"\"+mess(196,192,1)+"\"+mess(228,192,1)
        Return
    Endif
    If ([F:SQH]PTE<>"" & [F:SQH]PTE<>[M]PTE) | ([M]DEP<>"" & [F:SQH]DEP<>[M]DEP)
       OK=0 : GERR=1
       GMESSAGE=[F:SQH]SQHNUM-mess(27,159,1)-[F:SQD]ITMREF+"\"+mess(196,192,1)+"\"+mess(104,192,1)
       Return
    Endif
    
    If [F:SQH]PRITYP<>[M]PRITYP | [F:SQH]VACBPR<>[M]VACBPR
       OK=0 : GERR=1
       GMESSAGE=[F:SQH]SQHNUM-mess(27,159,1)-[F:SQD]ITMREF+"\"+mess(196,192,1)+"\"+mess(105,192,1)
       Return
    Endif
    
    # 71065 : PJT
    ##Gbn-Fq77304-New entry point to avoid the control on the project field
    #GPE=0 : GPOINT="SOHCTLPJT" : Gosub ENTREE From EXEFNC
    #If !GPE
    # If [F:SQH]PJT<>[M]PJT
    #    OK=0 : GERR=1
    #    GMESSAGE=[F:SQH]SQHNUM-mess(27,159,1)-[F:SQD]ITMREF+"\"+mess(196,192,1)+"\"+mess(107,192,1)
    #    Return
    # Endif
    #Endif
    # 71065 : PJT
    
    # FGR 24/11/2011 : X3SUIVI71065 : (début) complète le test par le paramètre PJTSNGDOC
      If func TRTPJT.GET_PARAM_PJTSNGDOC([F:SQH]SALFCY) = G_OUI Then
        # Il est interdit d'avoir des affaires différentes sur la même pièce
        # On peut tester uniquement l'entête puisque, par conséquent, les lignes auront toutes la même valeur
        If [F:SQD]PJT<>[M]PJT
          OK=0 : GERR=1
          GMESSAGE=[F:SQH]SQHNUM-mess(27,159,1)-[F:SQD]ITMREF+"\"+mess(196,192,1)+"\"+mess(107,192,1)
          Return
        Endif
      Endif
    # FGR 24/11/2011 : X3SUIVI71065 : (fin) complète le test par le paramètre PJTSNGDOC
    
    # Livraison commande complète : Le site de la ligne doit être celui de l'entête
    If [M:SOH2]DME=3 & [M:SOH2]STOFCY <> "" & [F:SQD]STOFCY <> [M:SOH2]STOFCY
       OK=0 : GERR=1
       GMESSAGE=[F:SQH]SQHNUM-mess(27,159,1)-[F:SQD]ITMREF-mess(81,197,1)-[F:SQD]STOFCY+"\"+mess(214,192,1)
       Return
    Endif
    
    # Controle du champ GRUFLG :
    # Si Oui (1), pas de restriction
    #  Sinon (2), vérifier que les éléments en % ont la meme valeur
    Local Integer I2
    Local Decimal DTAAMTCMP
    Local Char TSTRUL
    For I=0 To dim([F:SQH]INVDTA) - 1
        If [F:SQH]INVDTA(I) = 0 : Break : Endif
        If [F:SQH]INVDTATYP(I) = 3 : # %
            # Recherche Param concernant Doc Ori et Dest
            TSTRUL = num$([F:SQH]INVDTA(I)) + "~1~10"
            I2=find(TSTRUL, [M:SFIT]T_TST_RUL)-1
    
            If I2>0 and [M:SFIT]T_GRUFLG(I2) = 2 : # non si diff  # FGR 22/01/2015 : X3SUIVI105274 manque I2>0
                # Valeur de l'element dans le devis pické :  [F:SQH]INVDTAAMT(I)
                # Valeur de l'élément dans la livraison
                If [M:SFIT]T_BRDRUL(I2)=1 and [F:SQH]QUOSTA<>1 : # eclaté sur 1er devis et deja partiellement ou totalement commandé
                    DTAAMTCMP=0
                Else
                    DTAAMTCMP=[F:SQH]INVDTAAMT(I)
                Endif
                I2 = find ( [F:SQH]INVDTA(I) , [M:SOH3]INVDTA )
                If I2>0 and [M:SOH3]INVDTAAMT(I2-1) <> DTAAMTCMP
                    OK=0 : GERR=1
                    # Pour cet élément de facturation, le regroupement avec des valeurs différentes est interdit (xxx)"
                    Local Char SHOAXX
                    Call LECTEXTRA([L]SHOAXX,"SFOOTINV","SHOAXX",num$([F:SQH]INVDTA(I)),"") From ATEXTRA
                    GMESSAGE = mess(327,192,1) + " (" + SHOAXX+ ")"
                    Break
                Endif
            Endif
        Endif
    Next I
    
    # ACA - Controle des codes adresses client commande
    If ([F:SQH]BPAORD<>[M:ADB1]BPAADD)
        OK=0 : GERR=1
        GMESSAGE=[F:SQH]SQHNUM-mess(27,159,1)-[F:SQD]ITMREF-
    &       format$(GFMDAT,[F:SQD]QUODAT)+"\"+mess(196,192,1)+"\"+mess(330,192,1) :#--CPO 83985 GFMDAT au lieu de GFMD
        Return
    Endif
    
    # LTA.en 79065
    # If func AFNC.ACTIV("LTA") & GLOCUSATAX & [M:SOH4]NBLIG>0 & [F:SQH]SSTENTCOD<>[M:SOH1]SSTENTCOD   # 106867.o
    If func AFNC.ACTIV("LTA") & [F:CPY]SSTTAXACT = 2 & [M:SOH4]NBLIG>0 & [F:SQH]SSTENTCOD<>[M:SOH1]SSTENTCOD   # 106867.n
      OK=0 : GERR=1
      GMESSAGE=func AFNC.MES2(mess(374,192,1), [F:SQH]SQHNUM, [F:SQH]SSTENTCOD)
      Return
    Endif
    # LTA.en 79065
    Return
    
    #########################################################################
    $RAFFRAICHI
    #-----------------------------------------------------------------------#
    # Raffraichissement des listes de picking pour les lignes déjà saisies  #
    #-----------------------------------------------------------------------#
    If sum([M:SOH4]SQDLIN) <> 0
       For I=0 To [M:SOH4]NBLIG-1
          # La ligne est issue d'un picking devis réalisé au cours de cette transaction
          If [M:SOH4]DETSQHNUM(I)<>"" & [M:SOH4]CREFLG(I)=0 & !find([M:SOH4]LINTYP(I),3,4,5,11,12,13)
             Case currbox
              When GBOXSQ1 : Read [SQD]SQD0=[M:SOH4]DETSQHNUM(I);[M:SOH4]SQDLIN(I)
              When Default
             Endcase
             If    WPICK=1 Gosub DEPICK From GOBJSUB
             Elsif WPICK=2 Gosub REPICK From GOBJSUB
             Endif
          Endif
       Next I
    Endif
    Return
    ########################################
    Subprog IB_NBLIG4
    
    Raz GBOUT1, GBOUT2, GBOUT3, GBOUT4
    
    If GFONC1 <> "GESSDH" & [M]SDHNUM(nolign-1) <> "" GBOUT1 = mess(54,198,1) Endif
    If GFONC1 <> "GESSIH" & [M]NUM(nolign-1)    <> "" GBOUT2 = mess(55,198,1) Endif
    If [M]FMINUM(nolign-1) <> ""
        If GFONC1 <> "GESMFG" & [M]FMI(nolign-1) = 5
            GBOUT3 = mess(166,198,1)
        Elsif GFONC1 <> "GESPOH"
            GBOUT4 = mess(260,198,1)
            Raz GBOUT5
        Endif
    Else
        Raz GBOUT5
    Endif
    If GFONC1="GESPRH" | [M]PRHNUM(nolign-1)="" Raz GBOUT6 Endif
    Call IB_NOTECHECK([M]ITMREF(nolign-1),"ITMREF",7)  From TRTNTSCTL # product notes EWI 86290
    Call IB_PRDINF([M]ITMREF(nolign-1),8) From PRDINFLIB  # DF 79831 EWI 86290
    
    End
    ########################################
    Subprog VOH_RESYNCHRONIZATION()
    
    Local Integer IERR
    Local Integer ICOUNT
    Local Integer ICOUNTTOT
    Local Integer IADXLOG
    Local Integer ISALREV
    
      # ----------------------
      Local File FACILITY [FCY]
      Local File VSORDER [VOH]
      Local File SORDER  [SOH]
      # ----------------------
      IERR = 0
      IADXLOG = (adxlog = 1)
      # ----------------------
      Call OUVRE_TRACE(mess(556,192,1)) From LECFIC
      # ----------------------
      ICOUNTTOT = 0
      Filter [FCY] Where [F:FCY]SALFLG = [V]CST_AYES
      For [FCY]
        ISALREV = fmet GACTX.APARAM.AGETVALNUM([V]CST_ALEVFCY, [F:FCY]FCY, "SALREV")
        If ISALREV = 2 or ISALREV = 3 Then
          If IADXLOG = [V]CST_AFALSE Then
            Trbegin [VOH]
          Endif
          # ----------------------
          ICOUNT = 0
          Delete [VOH] Where [F:VOH]SALFCY = [F:FCY]FCY and [F:VOH]CURREVFLG = [V]CST_AYES
          For [SOH] Where [F:SOH]SALFCY = [F:FCY]FCY
            Raz [F:VOH]
            [F:VOH]SOHNUM = [F:SOH]SOHNUM
            [F:VOH]REVNUM = [F:SOH]REVNUM
            [F:VOH]SALFCY = [F:SOH]SALFCY
            [F:VOH]CURREVFLG = [V]CST_AYES
            Write [VOH]
            If fstat <> [V]CST_AOK Then
              Call ECR_TRACE([F:FCY]FCY - ":" - mess(552,192,1), 1) From GESECRAN
              IERR = 1
              Break
            Endif
            ICOUNT += 1
          Next
          # ----------------------
          If IERR = 0 Then
            If ICOUNT > 0
              Call ECR_TRACE(func AFNC.MES2(mess(558,192,1), num$(ICOUNT), [F:FCY]FCY), 0) From GESECRAN
            Endif
            If IADXLOG = [V]CST_AFALSE Then
              Commit
            Endif
          Else
            If IADXLOG = [V]CST_AFALSE Then
              Rollback
            Endif
          Endif
          ICOUNTTOT += ICOUNT
        Endif
      Next
      Filter [FCY]
      # ----------------------
      If IERR = 0 Then
        Call ECR_TRACE(func AFNC.MES1(mess(557,192,1), num$(ICOUNTTOT)), 0) From GESECRAN
      Endif
      # ----------------------
      Call FERME_TRACE From LECFIC
      Call LEC_TRACE From LECFIC
    End
    
    #########################################################################
    #**
    #* Create first VSORDER record for a new order
    #* @param SSALFCY : Sales site on the order
    #* @param SSOHNUM : Order number
    #* @param IREVNUM : Revision number
    #*!
    Funprog INIT_VSORDER_RECORD(SSALFCY, SSOHNUM, IREVNUM)
    Value Char SSALFCY
    Value Char SSOHNUM
    Value Integer IREVNUM
    
    Local Integer IARENDRE
    Local Integer IADXLOG
    Local Integer ISALREV
    
      IARENDRE = [V]CST_AOK
      # ----------------------
      ISALREV = fmet GACTX.APARAM.AGETVALNUM([V]CST_ALEVFCY, SSALFCY, "SALREV")
      If ISALREV = 2 or ISALREV = 3 Then
        # ----------------------
        Local File VSORDER [VOH]
        # ----------------------
        Look [VOH]VOH0=SSOHNUM;IREVNUM
        If fstat <> [V]CST_AOK Then
          IADXLOG = (adxlog = 1)
          If IADXLOG = [V]CST_AFALSE Then
            Trbegin [F:VOH]
          Endif
          # ----------------------
          Raz [F:VOH]
          [F:VOH]SOHNUM = SSOHNUM
          [F:VOH]REVNUM = IREVNUM
          [F:VOH]SALFCY = SSALFCY
          [F:VOH]CURREVFLG = [V]CST_AYES
          Write [VOH]
          If fstat Then
            GERR = 1
            GMESSAGE = mess(552,192,1)
            IARENDRE = [V]CST_AERROR
          Endif
          # ----------------------
          If IADXLOG = [V]CST_AFALSE Then
            If IARENDRE < [V]CST_AERROR Then
              Commit
            Else
              Rollback
            Endif
          Endif
        Else
          GERR = 1
          GMESSAGE = mess(552,192,1)
          IARENDRE = [V]CST_AERROR
        Endif
      Endif
    End IARENDRE
    
    #########################################################################
    #**
    #* Increase [F:VOH]REVNUM on record [F:VOH]CURREVFLG = [V]CST_AYES for the current order
    #* @param SSALFCY : Sales site on the order
    #* @param SSOHNUM : Order number
    #* @param IOLDREVNUM : OLD current revision number
    #* @param INEWREVNUM : NEW current revision number
    #*!
    Funprog INCREASE_VSORDER_RECORD(SSALFCY, SSOHNUM, IOLDREVNUM, INEWREVNUM)
    Value Char SSALFCY
    Value Char SSOHNUM
    Value Integer IOLDREVNUM
    Value Integer INEWREVNUM
    
    Local Integer IARENDRE
    Local Integer IADXLOG
    Local Integer ISALREV
    
      IARENDRE = [V]CST_AOK
      # ----------------------
      ISALREV = fmet GACTX.APARAM.AGETVALNUM([V]CST_ALEVFCY, SSALFCY, "SALREV")
      If ISALREV = 2 or ISALREV = 3 Then
        # ----------------------
        Local File VSORDER [VOH]
        # ----------------------
        Read [VOH]VOH0=SSOHNUM;IOLDREVNUM
        If fstat = [V]CST_AOK Then
          IADXLOG = (adxlog = 1)
          If IADXLOG = [V]CST_AFALSE Then
            Trbegin [F:VOH]
          Endif
          If [F:VOH]CURREVFLG = [V]CST_AYES Then
            [F:VOH]REVNUM = INEWREVNUM     # Increate the revision number
            Rewrite [VOH]
            If fstat Then
              GERR = 1
              GMESSAGE = mess(552,192,1)
            Endif
          Else
            # Revision line given doesn't "[F:VOH]CURREVFLG = [V]CST_AYES".
            # Wrong : we are going to try to fix that to avoid an error
            Filter [VOH] Where [F:VOH]SOHNUM = SSOHNUM and [F:VOH]CURREVFLG = [V]CST_AYES
            For [VOH]
              Delete [VOH]Curr
            Next
            Filter [VOH]
            IARENDRE = func INIT_VSORDER_RECORD(SSALFCY, SSOHNUM, INEWREVNUM)
          Endif
          If IADXLOG = [V]CST_AFALSE Then
            If IARENDRE < [V]CST_AERROR Then
              Commit
            Else
              Rollback
            Endif
          Endif
        Else
          # Line is not existing : we are going to create it
          IARENDRE = func INIT_VSORDER_RECORD(SSALFCY, SSOHNUM, INEWREVNUM)
        Endif
      Endif
    End IARENDRE
    
    #########################################################################
    #**
    #* get order creation timestamp for selected revison
    #* @param REVNUM      : revision number
    #* @return(Datatime)  : Return OTIME
    #*!
    Funprog GET_ORDER_DATE(REVNUM)
      Value Integer REVNUM
      Local Datetime OTIME
      Local File VSORDER[VOH]
    
      Read [VOH]VOH0 = [M:SOHREV0]SOHNUM;[L]REVNUM
      OTIME = [F:VOH]CREDATTIM
    
    End OTIME
    
    ######################################################################################
    #**
    #* display order lines for current revision
    #* @param REVNUM : revision number
    #*!
    Subprog CUR_LINE
      Local Integer NI
    
      Local File SORDERP [SOP]
      Local File SORDERQ [SOQ]
      Raz [M:SOHREV4]
      nolign = 0
      Filter [SOP] Where [F:SOP]SOHNUM = [M:SOH0]SOHNUM Order By [F:SOP]SOPLIN
    
      For [SOP]
        nolign + = 1
        [M:SOHREV4] = [F:SOP]
        [M:SOHREV4]VACITM1(nolign-1)   = [F:SOP]VACITM(0)
        [M:SOHREV4]VACITM2(nolign-1)   = [F:SOP]VACITM(1)
        [M:SOHREV4]VACITM3(nolign-1)   = [F:SOP]VACITM(2)
      Next
      nolign = 0
      Filter [SOQ] Where [F:SOQ]SOHNUM = [M:SOH0]SOHNUM Order By [F:SOQ]SOPLIN
      For [SOQ]
        nolign + = 1
        [M:SOHREV4] = [F:SOQ]
    
        [M:SOHREV4]DSTOFCY(nolign-1)   = [F:SOQ]STOFCY
        [M:SOHREV4]DPJT(nolign-1)      = [F:SOQ]PJT
        [M:SOHREV4]DDLVPIO(nolign-1)   = [F:SOQ]DLVPIO
        [M:SOHREV4]DBPTNUM(nolign-1)   = [F:SOQ]BPTNUM
        [M:SOHREV4]DMDL(nolign-1)      = [F:SOQ]MDL
        [M:SOHREV4]DDRN(nolign-1)      = [F:SOQ]DRN
        [M:SOHREV4]DDAYLTI(nolign-1)   = [F:SOQ]DAYLTI
        [M:SOHREV4]DDEMDLVDAT(nolign-1)= [F:SOQ]DEMDLVDAT
        [M:SOHREV4]DSHIDAT(nolign-1)   = [F:SOQ]SHIDAT
        [M:SOHREV4]DALLTYP(nolign-1)   = [F:SOQ]ALLTYP
        [M:SOHREV4]DCCLREN(nolign-1)   = [F:SOQ]CCLREN
        [M:SOHREV4]DCCLDAT(nolign-1)   = [F:SOQ]CCLDAT
        [M:SOHREV4]DBPAADD(nolign-1)   = [F:SOQ]BPAADD
    
    
      Next
      Filter [SOP]
      Filter [SOQ]
      [M:SOHREV4]NBLIG = nolign
      Affzo [M:SOHREV4]1-99
    End
    
    ##############################################################
    #**
    #* display sales order lines for historical revision
    #* @param REVNUM : revision number
    #*!
    Subprog REV_LINE(REVNUM)
      Value Integer REVNUM
      Local Integer NI
      Local Integer SKPLIN
      Local Integer DELLIN
      Local Datetime OTIME
    
      Local File VSORDERP [VOP]
      Local File VSORDERQ [VOQ]
    
      Local File SORDERP [SOP]
      Local File SORDERQ [SOQ]
    
      OTIME = func GET_ORDER_DATE(REVNUM)
      Raz [M:SOHREV4]
      nolign = 0
      Filter [SOP] Where [F:SOP]SOHNUM = [M:SOH0]SOHNUM and ([F:SOP]LINREVNUM <= REVNUM or [F:SOP]LINREVNUM = 0) Order By SOPLIN; LINREVNUM Desc
      For [SOP]
    
        Filter [SOQ] Where ([F:SOQ]SOHNUM = [M:SOH0]SOHNUM) and ([F:SOQ]SOQSEQ = [F:SOP]SOPSEQ) and ([F:SOQ]ITMREF = [F:SOP]ITMREF)
        Read [SOQ] First
        nolign + = 1
    
        [M:SOHREV4]                    = [F:SOP]
        [M:SOHREV4]VACITM1(nolign-1)   = [F:SOP]VACITM(0)
        [M:SOHREV4]VACITM2(nolign-1)   = [F:SOP]VACITM(1)
        [M:SOHREV4]VACITM3(nolign-1)   = [F:SOP]VACITM(2)
    
        [M:SOHREV4]                    = [F:SOQ]
        [M:SOHREV4]DSTOFCY(nolign-1)   = [F:SOQ]STOFCY
        [M:SOHREV4]DPJT(nolign-1)      = [F:SOQ]PJT
        [M:SOHREV4]DDLVPIO(nolign-1)   = [F:SOQ]DLVPIO
        [M:SOHREV4]DBPTNUM(nolign-1)   = [F:SOQ]BPTNUM
        [M:SOHREV4]DMDL(nolign-1)      = [F:SOQ]MDL
        [M:SOHREV4]DDRN(nolign-1)      = [F:SOQ]DRN
        [M:SOHREV4]DDAYLTI(nolign-1)   = [F:SOQ]DAYLTI
        [M:SOHREV4]DDEMDLVDAT(nolign-1)= [F:SOQ]DEMDLVDAT
        [M:SOHREV4]DSHIDAT(nolign-1)   = [F:SOQ]SHIDAT
        [M:SOHREV4]DALLTYP(nolign-1)   = [F:SOQ]ALLTYP
        [M:SOHREV4]DCCLREN(nolign-1)   = [F:SOQ]CCLREN
        [M:SOHREV4]DCCLDAT(nolign-1)   = [F:SOQ]CCLDAT
        [M:SOHREV4]DBPAADD(nolign-1)   = [F:SOQ]BPAADD
    
      Next
      Filter [SOP]
      Filter [SOQ]
      [M:SOHREV4]NBLIG = nolign
    
      DELLIN = 0
    
      Filter [VOP] Where [F:VOP]SOHNUM = [M:SOHREV0]SOHNUM and [F:VOP]LINREVNUM <= [L]REVNUM  Order By [F:VOP]SOPLIN; [F:VOP]LINREVNUM Desc
    
      For [VOP]
        SKPLIN = [V]CST_AFALSE
    
        If [F:VOP]SOPLIN = DELLIN
          SKPLIN = [V]CST_ATRUE
        Endif
    
        If [F:VOP]REVCOD = 'A'  and [F:VOP]CREDATTIM < [L]OTIME
    
          DELLIN = [F:VOP]SOPLIN
          SKPLIN = [V]CST_ATRUE
        Endif
    
        For NI  = 0 To [M:SOHREV4]NBLIG
          If ([M:SOHREV4]SOPLIN(NI) = [F:VOP]SOPLIN) and ([M:SOHREV4]ITMREF(NI) = [F:VOP]ITMREF)
            SKPLIN = [V]CST_ATRUE
          Endif
        Next NI
    
        If SKPLIN = [V]CST_AFALSE
          Filter [VOQ] Where ([F:VOQ]SOHNUM = [M:SOHREV0]SOHNUM) and ([F:VOQ]LINREVNUM = [F:VOP]LINREVNUM) and ([F:VOQ]SOQSEQ = [F:VOP]SOPSEQ) and ([F:VOQ]ITMREF = [F:VOP]ITMREF)
          Read [VOQ] First
    
          nolign + = 1
    
          [M:SOHREV4]                     = [F:VOP]
          [M:SOHREV4]VACITM1(nolign-1)    = [F:VOP]VACITM(0)
          [M:SOHREV4]VACITM2(nolign-1)    = [F:VOP]VACITM(1)
          [M:SOHREV4]VACITM3(nolign-1)    = [F:VOP]VACITM(2)
    
          [M:SOHREV4]                     = [F:VOQ]
          [M:SOHREV4]DSTOFCY(nolign-1)    = [F:VOQ]STOFCY
          [M:SOHREV4]DPJT(nolign-1)       = [F:VOQ]PJT
          [M:SOHREV4]DDLVPIO(nolign-1)    = [F:VOQ]DLVPIO
          [M:SOHREV4]DBPTNUM(nolign-1)    = [F:VOQ]BPTNUM
          [M:SOHREV4]DMDL(nolign-1)       = [F:VOQ]MDL
          [M:SOHREV4]DDRN(nolign-1)       = [F:VOQ]DRN
          [M:SOHREV4]DDAYLTI(nolign-1)    = [F:VOQ]DAYLTI
          [M:SOHREV4]DDEMDLVDAT(nolign-1) = [F:VOQ]DEMDLVDAT
          [M:SOHREV4]DSHIDAT(nolign-1)    = [F:VOQ]SHIDAT
          [M:SOHREV4]DALLTYP(nolign-1)    = [F:VOQ]ALLTYP
          [M:SOHREV4]DCCLREN(nolign-1)    = [F:VOQ]CCLREN
          [M:SOHREV4]DCCLDAT(nolign-1)    = [F:VOQ]CCLDAT
          [M:SOHREV4]DBPAADD(nolign-1)   = [F:VOQ]BPAADD
    
          [M:SOHREV4]NBLIG = nolign
        Endif
      Next
    
      Filter [VOP]
      Filter [VOQ]
    
      Sorta [M:SOHREV4]NBLIG [M:SOHREV4]NBLIG Order By [M:SOHREV4]SOPLIN([S]indice)
      Affzo [M:SOHREV4]1-99
    End
    
    ######################################################################################
    
    #**
    #* display order lines for previous historical revision
    #* @param REVNUM : revision number
    Subprog REV_LINE_HIST(REVNUM)
    Value Integer REVNUM
    Local Integer NI
    Local Integer SKPLIN
    Local Integer DELLIN
    Local Datetime OTIME
    
    If [L]REVNUM >= 0
    
      Local File VSORDERP [VOP]
      Local File VSORDERQ [VOQ]
    
      Local File SORDERP [SOP]
      Local File SORDERQ [SOQ]
    
      OTIME = func GET_ORDER_DATE(REVNUM)
      Raz [M:SOHREV4H]
      nolign = 0
      Filter [SOP] Where [F:SOP]SOHNUM = [M:SOH0]SOHNUM and ([F:SOP]LINREVNUM <= REVNUM or [F:SOP]LINREVNUM = 0) Order By SOPLIN; LINREVNUM Desc
      For [SOP]
        Filter [SOQ] Where [F:SOQ]SOHNUM = [M:SOH0]SOHNUM and ([F:SOQ]SOQSEQ = [F:SOP]SOPSEQ) and ([F:SOQ]ITMREF = [F:SOP]ITMREF)
    
        Read [SOQ] First
        nolign + = 1
        [M:SOHREV4H] = [F:SOP]
        [M:SOHREV4H]VACITM1(nolign-1)    = [F:SOP]VACITM(0)
        [M:SOHREV4H]VACITM2(nolign-1)    = [F:SOP]VACITM(1)
        [M:SOHREV4H]VACITM3(nolign-1)    = [F:SOP]VACITM(2)
    
        [M:SOHREV4H]                     = [F:SOQ]
        [M:SOHREV4H]DSTOFCY(nolign-1)    = [F:SOQ]STOFCY
        [M:SOHREV4H]DPJT(nolign-1)       = [F:SOQ]PJT
        [M:SOHREV4H]DDLVPIO(nolign-1)    = [F:SOQ]DLVPIO
        [M:SOHREV4H]DBPTNUM(nolign-1)    = [F:SOQ]BPTNUM
        [M:SOHREV4H]DMDL(nolign-1)       = [F:SOQ]MDL
        [M:SOHREV4H]DDRN(nolign-1)       = [F:SOQ]DRN
        [M:SOHREV4H]DDAYLTI(nolign-1)    = [F:SOQ]DAYLTI
        [M:SOHREV4H]DDEMDLVDAT(nolign-1) = [F:SOQ]DEMDLVDAT
        [M:SOHREV4H]DSHIDAT(nolign-1)    = [F:SOQ]SHIDAT
        [M:SOHREV4H]DALLTYP(nolign-1)    = [F:SOQ]ALLTYP
        [M:SOHREV4H]DCCLREN(nolign-1)    = [F:SOQ]CCLREN
        [M:SOHREV4H]DCCLDAT(nolign-1)    = [F:SOQ]CCLDAT
        [M:SOHREV4H]DBPAADD(nolign-1)   = [F:SOQ]BPAADD
    
      Next
      Filter [SOP]
      Filter [SOQ]
      [M:SOHREV4H]NBLIG = nolign
    
      DELLIN = 0
    
      Filter [VOP] Where [F:VOP]SOHNUM = [M:SOHREV0]SOHNUM and [F:VOP]LINREVNUM <= [L]REVNUM  Order By [F:VOP]SOPLIN; [F:VOP]LINREVNUM Desc
    
      For [VOP]
        SKPLIN = [V]CST_AFALSE
    
        If [F:VOP]SOPLIN = DELLIN
          SKPLIN = [V]CST_ATRUE
        Endif
    
        If [F:VOP]REVCOD = 'A'  and [F:VOP]CREDATTIM < [L]OTIME
          DELLIN = [F:VOP]SOPLIN
          SKPLIN = [V]CST_ATRUE
        Endif
    
        For NI  = 0 To [M:SOHREV4H]NBLIG
        If ([M:SOHREV4H]SOPLIN(NI) = [F:VOP]SOPLIN) and ([M:SOHREV4H]ITMREF(NI) = [F:VOP]ITMREF)
            SKPLIN = [V]CST_ATRUE
          Endif
        Next NI
    
        If SKPLIN = [V]CST_AFALSE
    
          Filter [VOQ] Where [F:VOQ]SOHNUM = [M:SOHREV0]SOHNUM and ([F:VOQ]LINREVNUM = [F:VOP]LINREVNUM) and ([F:VOQ]SOQSEQ = [F:VOP]SOPSEQ) and ([F:VOQ]ITMREF = [F:VOP]ITMREF)
          Read [VOQ] First
    
          nolign + = 1
    
          [M:SOHREV4H] = [F:VOP]
          [M:SOHREV4H]VACITM1(nolign-1)   = [F:VOP]VACITM(0)
          [M:SOHREV4H]VACITM2(nolign-1)   = [F:VOP]VACITM(1)
          [M:SOHREV4H]VACITM3(nolign-1)   =  [F:VOP]VACITM(2)
    
          [M:SOHREV4H]                    = [F:VOQ]
          [M:SOHREV4H]DSTOFCY(nolign-1)   = [F:VOQ]STOFCY
          [M:SOHREV4H]DPJT(nolign-1)      = [F:VOQ]PJT
          [M:SOHREV4H]DDLVPIO(nolign-1)   = [F:VOQ]DLVPIO
          [M:SOHREV4H]DBPTNUM(nolign-1)   = [F:VOQ]BPTNUM
          [M:SOHREV4H]DMDL(nolign-1)      = [F:VOQ]MDL
          [M:SOHREV4H]DDRN(nolign-1)      = [F:VOQ]DRN
          [M:SOHREV4H]DDAYLTI(nolign-1)   = [F:VOQ]DAYLTI
          [M:SOHREV4H]DDEMDLVDAT(nolign-1)= [F:VOQ]DEMDLVDAT
          [M:SOHREV4H]DSHIDAT(nolign-1)   = [F:VOQ]SHIDAT
          [M:SOHREV4H]DALLTYP(nolign-1)   = [F:VOQ]ALLTYP
          [M:SOHREV4H]DCCLREN(nolign-1)   = [F:VOQ]CCLREN
          [M:SOHREV4H]DCCLDAT(nolign-1)   = [F:VOQ]CCLDAT
          [M:SOHREV4H]DBPAADD(nolign-1)   = [F:VOQ]BPAADD
    
          [M:SOHREV4H]NBLIG = nolign
        Endif
      Next
    
      Filter [VOP]
      Filter [VOQ]
    
      Sorta [M:SOHREV4H]NBLIG [M:SOHREV4H]NBLIG Order By [M:SOHREV4H]SOPLIN([S]indice)
      Affzo [M:SOHREV4H]1-99
      Endif
    End
    
    ######################################################################################
    #**
    #* display header data for revision
    #* @param REVNUM : revision number
    #*!
    Subprog REV_HDR(REVNUM)
      Value Integer REVNUM
      Local Integer NI
    
    If [L]REVNUM = [M:SOH0]REVNUM
        Local File SORDER[SOH]
        Read [SOH]SOH0 = [M:SOHREV0]SOHNUM
    
        [M:SOHREV3]NBAXE = [M:SOH3]NBAXE
        For NI = 0 To [M:SOHREV3]NBAXE
          [M:SOHREV3]NAMDIE(NI) = [M:SOH3]NAMDIE(NI)
          [M:SOHREV3]CCE(NI) = [F:SOH]CCE(NI)
          [M:SOHREV3]DIE(NI) = [F:SOH]DIE(NI)
        Next NI
    
        [M:SOHREV3]NBFAC = [M:SOH3]NBFAC
        For NI = 0 To [M:SOHREV3]NBFAC-1
          [M:SOHREV3]SHO(NI) = [M:SOH3]SHO(NI)
          [M:SOHREV3]INVDTAAMTSTR(NI) = num$([F:SOH]INVDTAAMT(NI))
        Next NI
    
    Else
      If REVNUM >= 0
        Local File VSORDER[VOH]
        Read [VOH]VOH0 = [M:SOHREV0]SOHNUM;[L]REVNUM
    
        [M:SOHREV3]NBAXE = [M:SOH3]NBAXE
        For NI = 0 To [M:SOHREV3]NBAXE
          [M:SOHREV3]NAMDIE(NI) = [M:SOH3]NAMDIE(NI)
          [M:SOHREV3]CCE(NI) = [F:VOH]CCE(NI)
          [M:SOHREV3]DIE(NI) = [F:VOH]DIE(NI)
        Next NI
    
        [M:SOHREV3]NBFAC = [M:SOH3]NBFAC
        For NI = 0 To [M:SOHREV3]NBFAC-1
          [M:SOHREV3]SHO(NI) = [M:SOH3]SHO(NI)
          [M:SOHREV3]INVDTAAMTSTR(NI) = num$([F:VOH]INVDTAAMT(NI))
        Next NI
    
      Endif
    Endif
    # Issue X3-169498 - 2019-23-12 by MDZ : Begin
    If func AFNC.ACTIV("EDIX3")>0
      [M:SOHREV2]DEMDLVHOU = [M:SOH2]DEMDLVHOU #not in historical table
    Endif
    # Issue X3-169498 - 2019-23-12 by MDZ : End
      [M:SOHREV2]SDHTYP = [M:SOH2]SDHTYP #not in historical table
    
    
    
    End
    ####################################################################################
    #**
    #* display header data for previous revision
    #* @param REVNUM : revision number
    #*!
    Subprog REV_HDR_HIST (REVNUM)
      Value Integer REVNUM
    
      Raz [M:SOHREV0H]
      Raz [M:SOHREV1H]
      Raz [M:SOHREV2H]
      Raz [M:SOHREV3H]
    
        If [L]REVNUM >= 0
    
          Local File VSORDER[VOH]
          Read [VOH]VOH0 = [M:SOH0]SOHNUM;[L]REVNUM
    
          [M:SOHREV0H] = [F:VOH]
    
          [M:SOHREV1H] = [F:VOH]
    
          [M:SOHREV1H]HLDSTA = [M:SOH1]HLDSTA #not in historical table
    
          [M:SOHREV2H] = [F:VOH]
    # Issue X3-169498 - 2019-23-12 by MDZ : Begin
          If func AFNC.ACTIV("EDIX3")>0
          [M:SOHREV2]DEMDLVHOU = [M:SOH2]DEMDLVHOU #not in historical table
          Endif
    # Issue X3-169498 - 2019-23-12 by MDZ : End
          [M:SOHREV2H]SDHTYP = [M:SOH2]SDHTYP #not in historical table
    
    
          [M:SOHREV3H] = [F:VOH]
          [M:SOHREV3H]NBAXE = [M:SOH3]NBAXE
    
          For NI = 0 To [M:SOH3]NBAXE-1
             [M:SOHREV3H]NAMDIE(NI) = [M:SOH3]NAMDIE(NI)
             [M:SOHREV3H]CCE(NI) = [F:VOH]CCE(NI)
             [M:SOHREV3H]DIE(NI) = [F:VOH]DIE(NI)
          Next NI
    
          [M:SOHREV3H]NBFAC = [M:SOH3]NBFAC
          For NI = 0 To [M:SOH3]NBFAC-1
            [M:SOHREV3H]INVDTA(NI) = [F:VOH]INVDTA(NI)
            [M:SOHREV3H]SHO(NI)= [M:SOH3]SHO(NI)
            [M:SOHREV3H]INVDTAAMTSTR(NI) = num$([F:VOH]INVDTAAMT(NI))
            [M:SOHREV3H]INVDTATYP(NI) = [F:VOH]INVDTATYP(NI)
    
    # DIS-X3-141376-Bug-SUBSOHREVError - SDZ 10/06/2019 START
            If func AFNC.ACTIV("LTA")>0
                [M:SOHREV3H]SFISSTCOD(NI) = [F:VOH]SFISSTCOD(NI)
            Endif
    # DIS-X3-141376-Bug-SUBSOHREVError - SDZ 10/06/2019 END
    
    
          Next NI
    
        Endif
    End
    
    ###################################################################################
    #**
    #* change style for selected fileds in mask
    #* @param ABREV   : screen with current revision
    #* @param ABFIC   : screen with previous revision
    #* @param REVNUM  : revision number
    #* @param BLKNUM  : block number
    #* @param STYLE   : new style
    #*!
    Subprog CHNG_REV_HDR_STYLE(ABREV,ABFIC,REVNUM,BLKNUM,STYLE)
      Value    Char     ABREV
      Value    Char     ABFIC
      Value    Integer  REVNUM
      Value    Integer  BLKNUM
      Value    Char     STYLE
    
      Local    Char     NOMZON(GLONAVA)
      Local    Char     FULFIELD(250)
      Local    Char     FULFIELD1(250)
      Local    Char     FULFIELD2(250)
      Local Integer     MA
    
      Gosub DEFVAR From WGOSOHREV
      For MA = 0 To NBMASK
        If ABMSK(MA) = [L]ABREV Then
          Gosub SETMASK From WGOSOHREV
          Break
        Endif
      Next MA
    
      Local File AMSKZON[AMZ]
    
        If BLKNUM <> 0
          Filter [AMZ] Where [AMZ]CODMSK = [L]ABREV and [F:AMZ]SAIAFF < 3 and [F:AMZ]NUMBLOC = BLKNUM # specific block
        Else
          Filter [AMZ] Where [AMZ]CODMSK = [L]ABREV and [F:AMZ]SAIAFF < 3 # all blocks in screen
        Endif
        For [AMZ]
    
          NOMZON = [F:AMZ]CODZON
          FULFIELD = "[M]" + [L]NOMZON
    
          For NI = 0 To evalue("dim(" + FULFIELD + ")") - 1
            FULFIELD1 = "[M]" + [L]NOMZON + "(" + num$(NI) + ")"
            FULFIELD2 = "[M:" + [L]ABFIC + "]" + [L]NOMZON + "(" + num$(NI) + ")"
            If (evalue("dim(" + FULFIELD1 + ")") >= 0) and (evalue("dim(" + FULFIELD2 + ")") >= 0)
                If evalue(FULFIELD1) <> evalue(FULFIELD2) and [L]REVNUM > 0 Then
                  Chgstl =FULFIELD1 With STYLE
                Else
                  Chgstl =FULFIELD1 With ""
                Endif
              Endif
          Next NI
    
        Next
        Filter [AMZ]
    End
    
    ######################################################################################
    #**
    #* change style for selected fileds in mask
    #* @param ABREV   : screen with current revision
    #* @param ABFIC   : screen with previous revision
    #* @param REVNUM  : revision number
    #* @param BLKNUM  : block number
    #* @param STYLE   : new style
    #*!
    Subprog CHNG_REV_LIN_STYLE(ABREV,ABFIC,REVNUM,BLKNUM, STYLE)
      Value    Char     ABREV
      Value    Char     ABFIC
      Value    Integer  REVNUM
      Value    Integer  BLKNUM
      Value    Char     STYLE
    
      Local    Char     NOMZON(GLONAVA)
      Local    Char     FULFIELD(250)
      Local   Integer   MA
      Local   Char      ABFICSOPLIN(250)
      Local   Char      ABREVSOPLIN(250)
      Local   Char      SFORMULA(250)
      Local   Integer   ABFICNOLIG
      Local   Integer   ABREVNOLIG
      Local   Integer   BLKTYP
      Local   Char      SNBLIG(GLONAVA)
    
       Local File AMSKZON[AMZ]
       Gosub DEFVAR From WGOSOHREV
       For MA = 0 To NBMASK
        If ABMSK(MA) = [L]ABREV Then
          Gosub SETMASK From WGOSOHREV
          Break
        Endif
       Next MA
    
       Filter [AMZ] Where [AMZ]CODMSK = [L]ABREV and [F:AMZ]CODTYP = "ABS" and [F:AMZ]SAIAFF < 3  and [F:AMZ]NUMBLOC = BLKNUM Order By [F:AMZ]NUMLIG
        For [AMZ]
          SNBLIG = [F:AMZ]CODZON
        Next
    
      Filter [AMZ] Where [AMZ]CODMSK = [L]ABREV and [F:AMZ]CODTYP <> "ABS" and [F:AMZ]SAIAFF < 3  and [F:AMZ]NUMBLOC = BLKNUM Order By [F:AMZ]NUMLIG
    
       For [AMZ]
            For ABREVNOLIG = 0 To evalue("[M:" + [L]ABREV + "]" + SNBLIG + "-1")
              NOMZON = [F:AMZ]CODZON
              FULFIELD = "[M]" + [L]NOMZON
              ABREVSOPLIN = "[M:" + [L]ABREV + "]SOPLIN(" + num$([L]ABREVNOLIG) + ")"
              ABFICSOPLIN = "[M:" + [L]ABFIC + "]SOPLIN(0..[M:" + [L]ABFIC + "]" + SNBLIG + "-1)"
              SFORMULA = "find(" + [L]ABREVSOPLIN + "," +  [L]ABFICSOPLIN + ")"
              ABFICNOLIG = evalue([L]SFORMULA)-1
              If (evalue("[M:" + [L]ABFIC + "]" + SNBLIG) > 0) and ([L]ABFICNOLIG >= 0)
                If (evalue("dim(FULFIELD(" + num$([L]ABREVNOLIG) + "))") >= 0) and (evalue("dim([M:" + [L]ABFIC + "]" + [L]NOMZON + "(ABFICNOLIG))") >= 0)
                  If evalue(FULFIELD + "(" + num$([L]ABREVNOLIG) + ")") <> evalue("[M:" + [L]ABFIC + "]" + [L]NOMZON + "(ABFICNOLIG)")
                    Chgstl =FULFIELD + "(" + num$([L]ABREVNOLIG) + ")" With STYLE
                  Else
                    Chgstl =FULFIELD + "(" + num$([L]ABREVNOLIG) + ")" With ""
                  Endif
                Endif
              Else
               If (evalue("dim(FULFIELD(" + num$([L]ABREVNOLIG) + "))") >=0) and (evalue("dim([M:" + [L]ABFIC + "]" + [L]NOMZON + "(ABFICNOLIG))") >= 0) # Issue X3-153741 - 2019-10-12 by MDZ
                Chgstl =FULFIELD + "(" + num$([L]ABREVNOLIG) + ")" With ""
               Endif # Issue X3-153741 - 2019-12-12 by MDZ
              Endif
            Next ABREVNOLIG
       Next
       Filter [AMZ]
    
    End
    
    ######################################################################################
    #**
    #* change style for selected grid in mask
    #* @param ABREV   : screen with current revision
    #* @param ABFIC   : screen with previous revision
    #* @param REVNUM  : revision number
    #* @param STYLE   : new style
    #*!
    Subprog CHNG_REV_GRID_STYLE(ABREV,ABFIC,REVNUM,BLKNUM, STYLE)
      Value    Char     ABREV
      Value    Char     ABFIC
      Value    Integer  REVNUM
      Value    Integer  BLKNUM
      Value    Char     STYLE
    
      Local    Char     NOMZON(GLONAVA)
      Local    Char     FULFIELD(250)
      Local   Integer   MA
      Local   Integer   NI
      Local   Char      SNBLIG(GLONAVA)
    
       Local File AMSKZON[AMZ]
       Gosub DEFVAR From WGOSOHREV
       For MA = 0 To NBMASK
        If ABMSK(MA) = [L]ABREV Then
          Gosub SETMASK From WGOSOHREV
          Break
        Endif
       Next MA
    
       Filter [AMZ] Where [AMZ]CODMSK = [L]ABREV and [F:AMZ]CODTYP = "ABS" and [F:AMZ]SAIAFF < 3  and [F:AMZ]NUMBLOC = BLKNUM Order By [F:AMZ]NUMLIG
       For [AMZ]
         SNBLIG = [F:AMZ]CODZON
       Next
    
       If SNBLIG <> ""
        Filter [AMZ] Where [AMZ]CODMSK = [L]ABREV and [F:AMZ]CODTYP <> "ABS" and [F:AMZ]SAIAFF < 3 and [F:AMZ]NUMBLOC = BLKNUM Order By [F:AMZ]NUMLIG
        For [AMZ]
            For NI = 0 To evalue("[M:" + [L]ABREV + "]" + SNBLIG + "-1")
              NOMZON = [F:AMZ]CODZON
              FULFIELD = "[M]" + [L]NOMZON
              If (evalue("[M:" + [L]ABFIC + "]" + SNBLIG) > 0)
                If (evalue("dim(FULFIELD(" + num$([L]NI) + "))") >= 0) and (evalue("dim([M:" + [L]ABFIC + "]" + [L]NOMZON + "(NI))") >= 0)
                  If evalue(FULFIELD + "(" + num$([L]NI) + ")") <> evalue("[M:" + [L]ABFIC + "]" + [L]NOMZON + "(NI)")
                    Chgstl =FULFIELD + "(" + num$([L]NI) + ")" With STYLE
                  Else
                    Chgstl =FULFIELD + "(" + num$([L]NI) + ")" With ""
                  Endif
                Endif
              Else
                Chgstl =FULFIELD + "(" + num$([L]NI) + ")" With ""
              Endif
            Next NI
        Next
       Endif
       Filter [AMZ]
    End
    
    
    Funprog TEST20000(PARAM)
    Value Char PARAM
    
    Local Char RETOUR(255)
    [L]RETOUR = "Retour du param = " + [L]PARAM
    
    End [L]RETOUR
    
    # Fin du traitement
    

    Même en enlevant les sauts de lignes et commentaires ce traitement fait encore 9000 lignes de code.

    Cordialement,

    Laurent

  • 0 in reply to L.V. Expertise X3

    voici l'erreur que j'obtiens à la compilation en 140.

    Par contre en version 12 avec le nouveau moteur aucun message , vous aviez raison. 

    merci pour votre réponse.