home *** CD-ROM | disk | FTP | other *** search
/ mail.altrad.com / 2015.02.mail.altrad.com.tar / mail.altrad.com / TEST / COMMERC_72_53OLD / commerc / PROGSOLD / temp.PRG < prev    next >
Text File  |  2014-04-02  |  150KB  |  5,286 lines

  1. PROCEDURE  MAIN ()
  2. * Auteur...: R M ALCOCK 
  3. * Date.....: 4 JAN 1998
  4. * Copyright: (c) 1995, R M ALCOCK, Tous droits réservés
  5. * Notes....: Commercial Interface for VRP portables
  6. *
  7. *
  8. #include "Inkey.ch"
  9. #include "Setcurs.ch"
  10. #include "Params"
  11. #include "Directry.ch"        // For DIRECTORY function
  12. #include "DCDIALOG.CH"
  13. #include "DCPRINT.CH"
  14. #include "FONT.CH"
  15. #include "Appevent.ch"
  16. #include "Gra.ch"
  17. #include "Xbp.ch"
  18. #include "Nls.ch"
  19. #include "DCbitmap.ch"
  20.  
  21. *
  22. LOCAL Mret, Last_Date, VolName
  23.  
  24. SETCURSOR(SC_NORMAL)
  25. *
  26. SET CONFIRM     ON
  27. SET DATE        FRENCH
  28. SET DELETED     ON
  29. SET EXACT       ON
  30. SET EXCLUSIVE   OFF
  31. SET FIXED       OFF
  32. SET SCOREBOARD  OFF
  33. SET WRAP        ON
  34. SET EPOCH TO    1980
  35. *SET DEFAULT TO F:
  36.  
  37. *NationMsg("fr")
  38. SetLocale( NLS_SCURRENCY, Chr(213) )     // Two lines to activate the euro symbol
  39. SetLocale( NLS_ICURRENCYEURO, "1" )
  40. LANGUAGE = "fr"
  41.  
  42. *
  43. *EXTERNAL WIN,WOUT,HLON,HLOFF,PASSWD,RMAMENU,keysoff,RA_BRWSWHL
  44. *
  45. public mbuff, fb[10], fref, MENUCLR, PICKCLR
  46. PUBLIC MTVA, MMONTANT, REMTOT, MFACTOT, TOTTTC, DPAY, MMQTE
  47. // MMQTE added for PROFESS
  48. PUBLIC New_Tarif:=.F., MDAT_MAX, M_Reg, M_Resp, MCLI, MRCODE, HCODE
  49. PUBLIC F_Ran, V_Ran, SEED, M_Control
  50. PUBLIC LCD
  51. public M_FILTER:="", M_Browse, cKey, N_Cli, N_Rec
  52. PUBLIC M_CLIC,M_TEL,M_ACT,CLIN,MCP,M_CLIP,T_Min,M_Dat1,M_Dat2,M_R_S,M_R_E
  53. PUBLIC GetList:={}
  54. PUBLIC ChosenClient
  55. //
  56. NET_USE (S_ATTACH, "ATTACH", .T., 0, "", "")
  57.  
  58. MDAT_MAX  = ATTACH->DATE_MAX
  59. M_Reg     = ATTACH->REGION
  60. M_Resp    = ATTACH->OWNER
  61. M_Control = ATTACH->PCON
  62. LCD       = ATTACH->LCD_SCREEN
  63. USE
  64.  
  65. IF ISCOLOR()
  66.    MENUCLR = D_MenuClr          // From PARAMS
  67.    PICKCLR = D_PickClr
  68. ELSE
  69.    MENUCLR=SETCOLOR()
  70.    PICKCLR="W/N,N/W,W/N,N/BG,W/N"
  71. ENDIF
  72.  
  73. CLEAR
  74.  
  75. MT=CONAME+" - SYSTEM COMMERCIAL"
  76. SEED=VAL(READ_SEED(6,5, MT, M_Reg))           // In file ENCODE.PRG
  77. F_Ran = RANDOM (SEED, 5, 31)       // Generate 100 random n°s between 1 and 31
  78. //
  79. //
  80. IF FILE ("XFER\NEWCLI.DBF")
  81.    NET_USE (S_TEMP1, "XFER\NEWCLI", .F., 0, "", "")
  82.    Last_Date = CTOD(DTOC(LUPDATE())) + 360      // Must ring Florensac every 60 days
  83.                                     // temporarily very long !!!!!
  84.    USE
  85. ELSE
  86.    Last_Date = CTOD("01/12/10")    // For the time being
  87. ENDIF
  88. //
  89. VolName := DIRECTORY("C:", "V")      // Read the label
  90.  
  91. //
  92. // If PWD.MEM exists when prog is restarted, something is wrong !
  93. IF (FILE ("C:\PWD.MEM");
  94.         .OR. DATE() > Last_Date;
  95.         .OR. VolName [1,F_NAME] <> "ALTRAD");
  96.         .AND. SEED <> -1
  97.  
  98.    CLEAR
  99.    @ 7,2 SAY ""
  100.    TEXT
  101.    La dernière fois que l'ordinateur était arreté, vous n'aviez pas
  102.    quitté le programme. Par consequent, il est nécessaire de réparer
  103.    les fichiers. Il est aussi possible que les dernières modifications
  104.    (et/ou saisie) n'ont pas été enregistrées.
  105.  
  106.    Patientez S.V.P.
  107.  
  108.    ENDTEXT
  109.  
  110.    NET_USE (S_CLIENT, "CLIENT", .T., 20, "", "")
  111.  
  112.    IF DATE() > Last_Date;
  113.        .OR. VolName [1,F_NAME] <> "ALTRAD"
  114.  
  115. do while .f.
  116.  
  117.       //
  118.       // Exterminate, Exterminate .......
  119.       //
  120.       GO BOTT
  121.       SKIP -1
  122.       COPY NEXT 1 TO TEMP
  123.       USE
  124. *      SWPRUNCMD("COPY CLIENT.DBF AZ.DBF>FRED",0, "", "")
  125. *      SWPRUNCMD("COPY CLIENT.DBT AZ.DBT>FRED",0, "", "")
  126.       COPY FILE CLIENT.DBF TO AZ.DBF
  127.       COPY FILE CLIENT.DBT TO AZ.DBT
  128.       NET_USE (S_CLIENT, "CLIENT", .T., 20, "", "")
  129.       ZAP
  130.       APPEND FROM TEMP
  131.       APPEND FROM AZ
  132.       NET_USE (S_TEMP1, "AZ", .T., 20, "", "")
  133.       ZAP
  134.       USE
  135. *      SWPRUNCMD("DEL TEMP.DB?",0, "", "")
  136. *      SWPRUNCMD("DEL AZ.DB?",0, "", "")
  137.       ERASE TEMP.DBF
  138.       ERASE TEMP.DBT
  139.       ERASE AZ.DBF
  140.       ERASE AZ.DBT
  141. enddo
  142.  
  143.    ELSE
  144.       // Check if any records are in the wrong state
  145.       LOCATE FOR .NOT. CLISCRAMBL
  146.       IF FOUND()
  147.          DO WHILE.NOT.EOF()
  148.             SCRAM_CLI (SEED)
  149.             CONTINUE
  150.          ENDDO
  151.          // Re-Index everything
  152.          USE
  153. *         SWPRUNCMD("PROGS\REINDEX *",0, "", "")
  154.          DO REINDEX WITH "*"
  155.       ENDIF
  156.    ENDIF
  157. ENDIF
  158. //
  159. SAVE ALL LIKE M_Control TO C:\PWD  // Create the file to detect illegal termination
  160. //
  161. ERRORLEVEL(0)
  162. NET_USE (S_CLIENT, "CLIENT", .F., 20, "", "")
  163. SET INDEX TO CLIREF,CLINOM,CLICP
  164. NET_USE (S_STOCK, "STOCK", .F., 20, "STCREF,STRLIB", "")
  165. *
  166. DO WHILE .T.
  167.  
  168.    bBlock = SetKey( K_F1, { || help_me ( ProcName(), ProcLine(), "" ) } )
  169.    SetMouse(.T.)
  170.    DO HLOFF WITH LCD
  171.    CLEAR
  172.    SELECT CLIENT
  173.    GO TOP
  174.    SET ORDER TO 1
  175.    SET FILTER TO
  176.    DO HLON
  177.    @ 23,35 SAY "F1 : Aide"
  178.    DO HLOFF WITH LCD
  179.    *
  180.    Mret=R_CLI(.T.)             // Select Client, Allow creation
  181.    IF Mret <= 0                // Vide
  182.  
  183.       IF SELECT ("TEMPCLIN") <> 0
  184.          SELECT TEMPCLIN
  185.          USE
  186.       ENDIF
  187.  
  188.       IF Mret < 0 
  189.          LOOP
  190.       ENDIF
  191.  
  192.       IF ConfirmBox( , ; 
  193.                        "Voulez vous terminer le programme ?", ; 
  194.                        "Quitter", ; 
  195.                         XBPMB_YESNO , ; 
  196.                         XBPMB_QUESTION+XBPMB_APPMODAL+XBPMB_MOVEABLE, ;
  197.                         XBPMB_DEFBUTTON2 ) = XBPMB_RET_NO
  198.          LOOP
  199.       ENDIF                  
  200.  
  201.       CLEAR
  202.       ERASE C:\PWD.MEM         // To confirm correct exit
  203.       RETURN                   // No Client selected
  204.  
  205.    ENDIF
  206.  
  207.    DO WHILE .T.
  208.       IF Mret=1                // Need to search
  209.          FREF = R_CLI2()
  210.          IF EMPTY(FREF)
  211.             SELECT TEMPCLIN
  212.             USE
  213.             EXIT
  214.          ENDIF
  215.       ELSE
  216.          FREF = CLIREF
  217.       ENDIF
  218.       //
  219.       // Client is selected
  220.       //
  221.       CLEAR
  222.       IF .NOT. REC_LOCK(30)       // Need lock to unscramble
  223.          RETURN
  224.       ENDIF
  225.       UNSCRAM_CLI(SEED)
  226.       Window_cli(4)                  // Display Client Details
  227.       SET CURSOR ON
  228.       SCRAM_CLI(SEED)
  229.       UNLOCK
  230.       IF Mret=2                         // Only one client
  231.          EXIT
  232.       ENDIF
  233.    ENDDO
  234. ENDDO
  235. RETURN
  236. *
  237. ****************************************
  238. *
  239. FUNCTION CC
  240. *.......................................
  241. *
  242. *COMMANDES
  243. *
  244. //
  245. *
  246. LOCAL aFields := {}, cKey, cOldColor, nRecSel
  247. *
  248. NET_USE (S_FACTA, "FACTA",  .F., 30, "FACTR", "")
  249. NET_USE (S_COM, "COM", .F., 30, "COM,COMCL", "BON")
  250. SET ORDER TO 2
  251. do keysoff
  252. *
  253. cKey=fref
  254. cOldColor := SetColor("W/B")
  255. AADD(aFields, {"REF",     {||BON->COMMANDE} } )
  256. AADD(aFields, {"ST" ,     {||BON->C_STATUS} } )
  257. AADD(aFields, {"DATE",    {||BON->D_COMM  } } )
  258. AADD(aFields, {"MONTANT", {||ROUND(BON->MONTANT*(1-BON->REM_SUP/100),2)} } )
  259. DO WHILE .T.
  260.    nRecSel := RA_BRWSWHL(aFields, {||BON->REFCLI = cKey}, cKey, 0, PICKCLR,;
  261.                           8, 1, 22, MaxCol()-1, "F9 - ZOOM COMMANDE",, )
  262.    DO CASE
  263.       CASE  nRecSel == 0
  264.         EXIT              // No record selected (Esc)
  265.  
  266.       CASE nRecSel < 0    // No matching Record
  267.         do none with 18,1,20,78,mbuff
  268.         EXIT
  269.  
  270.       OTHERWISE
  271.         do ZCC
  272.    ENDCASE
  273. ENDDO
  274. SetColor(cOldColor)
  275. CLEAR SCREEN
  276. SELECT BON
  277. use
  278. SELECT FACTA
  279. USE
  280. select CLIENT
  281. do kon
  282. RETURN .T.
  283. *
  284. ****************************************
  285. *
  286. FUNCTION CC2
  287. *.......................................
  288. *
  289. *Lines on COMMANDE
  290. *
  291. *
  292. LOCAL aFields := {}, cKey, cOldColor, nRecSel, mbuff
  293. *
  294. NET_USE (S_FACTA, "FACTA",  .F., 30, "FACTR", "")
  295. NET_USE (S_COM, "COM", .F., 30, "COM,COMCL", "BON")
  296. SET ORDER TO 2
  297. set exact off
  298. SET RELATION TO COMMANDE INTO FACTA
  299. do keysoff
  300. *
  301. cKey=fref
  302. seek cKey
  303. locate rest for val(c_status)<10
  304. if .not. found()
  305.    do none with 18,1,20,78,mbuff
  306. else
  307.    select FACTA
  308.    copy rest to c:temp1 while facture=bon->commande
  309.  
  310.    net_use (S_TEMP1, "c:temp1", .T., 0, "", "")
  311.    select bon
  312.    continue
  313.    do while refcli=fref
  314.       select FACTA
  315.       copy rest to c:temp2 while facture=bon->commande
  316.       select temp1
  317.       append from c:temp2
  318.       select bon
  319.       continue
  320.    enddo
  321.    erase c:temp2.dbf
  322.    select bon
  323.    set relation to
  324.    set order to 1
  325.    select temp1
  326.    delete for substr(article,1,1) $ "+-*"
  327.    pack
  328.    index on article to c:temp1
  329.    set relation to facture into bon
  330.    go top
  331.    cKey=article
  332.    cOldColor := SetColor("W/B")
  333.    AADD(aFields, {"REF",     {||TEMP1->ARTICLE} } )
  334.    AADD(aFields, {"DESIG.",{||TEMP1->LIB  } } )
  335.    AADD(aFields, {"QUANTITE" , {||TEMP1->QUANTITE } } )
  336.    AADD(aFields, {"DATE",    {||BON->D_COMM  } } )
  337.    DO WHILE .T.
  338.       nRecSel := RA_BRWSWHL(aFields, {||.T.}, cKey, 0, PICKCLR,;
  339.                           8, 1, 22, MaxCol()-1, "ARTICLES EN COMMANDE",, )
  340.       DO CASE
  341.          CASE  nRecSel == 0
  342.            EXIT              // No record selected (Esc)
  343.  
  344.          CASE nRecSel < 0    // No matching Record
  345.            do none with 18,1,20,78,mbuff
  346.            EXIT
  347.  
  348.          OTHERWISE
  349.  
  350.          ENDCASE
  351.    ENDDO
  352.    select temp1
  353.    use
  354.    erase c:temp1.dbf
  355.    erase c:temp1.ntx
  356. endif
  357. SetColor(cOldColor)
  358. CLEAR SCREEN
  359. SELECT BON
  360. use
  361. SELECT FACTA
  362. USE
  363. select CLIENT
  364. do kon
  365. set exact on
  366. RETURN .T.
  367. *
  368. ***
  369. *
  370. FUNCTION ZCC
  371. LOCAL zbuff:="", t:=0, l:=0, b:=23, r:=79
  372. //
  373. // Need rec_lock here because two people could try to change the lines at once
  374. // which would work because the lines are in TEMP not FACTA. Sort of deadly
  375. // embrace. LOCK should sort this out because it effectively locks both
  376. // the header and the lines. Need to make sure the same logic holds in the
  377. // MENU version of the program.
  378. //
  379. REC_LOCK(0)
  380. DO HLOFF WITH LCD
  381. do keysoff
  382. do win with t,l,b,r,zbuff,"COMMANDE"
  383.  
  384. DO COMM_OUT
  385. @ 24,0 CLEAR TO 24,79
  386. DO HLON
  387. mt= "F1-HELP     F2-MENU"
  388. @ 24,40-len(mt)/2 SAY mt
  389. DO HLOFF WITH LCD
  390. SET CURSOR OFF
  391. @ 22,10 SAY""
  392. DO WHILE LASTKEY()<>27
  393.    set key K_F2 to COMMMENU
  394.    wait ""                        // Wait allows function key actvation
  395. ENDDO
  396. SET CURSOR OFF
  397. do wout with t,l,b,r,zbuff
  398. @ 24,0 CLEAR TO 24,79
  399. set key K_F2 to
  400. *keyboard CHR(K_ESC)               // Force Exit
  401. RETURN .T.
  402. *
  403. ****************************************
  404. *
  405. FUNCTION EV
  406. *.......................................
  407. *
  408. *EVENTS
  409. *
  410. //
  411. *
  412. LOCAL aFields := {}, La:=SELECT(), mst, aSort[6], aSaveSort, aPres, bEval
  413.  
  414. *
  415. NET_USE (S_EVENT, "EVENT",  .F., 30, "EVENT,EVECODE", "")
  416. SEEK CLIENT->CLIREF
  417. IF .NOT. FOUND() .OR. LASTREC() == 0
  418.    do none with 18,1,20,78,mbuff
  419.    RETURN .T.
  420. ENDIF
  421.  
  422. do keysoff
  423.  
  424. COPY TO "TEMPEV" WHILE EVENT->REFCLI = CLIENT->CLIREF 
  425. NET_USE (S_EVENT, "TEMPEV",  .T., 0, "", "EVENT")
  426. INDEX ON DTOS(D_CRE)TO TEVDAT
  427. INDEX ON BONREF     TO TEVCODE
  428. INDEX ON TYPE       TO TEVTYPE
  429. SET INDEX TO TEVDAT, TEVCODE, TEVTYPE
  430.  
  431. *
  432. aSort[1] := GRA_CLR_WHITE // Sort Selected Color (Foreground)
  433. aSort[2] := GRA_CLR_RED   // Sort Selected Color (Background)
  434. aSort[3] := GRA_CLR_WHITE // Sort Unselected Color (Foreground)
  435. aSort[4] := GRA_CLR_DARKGRAY // Sort Unselected Color (Background)
  436. aSort[5] := BITMAP_RD_UP_RED  // Sort UP Bitmap
  437. aSort[6] := BITMAP_RD_DOWN_RED  // Sort DOWN Bitmap
  438.  
  439. aSaveSort := DC_FindBrowseSort(aSort)
  440.  
  441. aPres := ;
  442.   { { XBP_PP_COL_HA_FGCLR, GRA_CLR_WHITE },  ;
  443.     { XBP_PP_COL_HA_BGCLR, GRA_CLR_DARKGRAY }, ;
  444.     { XBP_PP_COL_DA_FGCLR, GRA_CLR_BLACK }, ;
  445.     { XBP_PP_COL_DA_BGCLR, GRA_CLR_WHITE } }
  446.  
  447. aPres := ;
  448.   { { XBP_PP_COL_HA_FGCLR, GRA_CLR_WHITE },  ;
  449.     { XBP_PP_COL_HA_BGCLR, GRA_CLR_DARKGRAY }, ;
  450.     { XBP_PP_COL_DA_FGCLR, GRA_CLR_BLACK }, ;
  451.     { XBP_PP_COL_DA_BGCLR, GRA_CLR_WHITE } }
  452.  
  453. aFields := ;
  454.    { ; // field            Header   Width  Index       Prompt
  455.    { {||EVENT->D_CRE},  'Date',       10,    "TEVDAT",  'Date' } , ;
  456.    { {||EVENT->TYPE},   'Libellé',    25,    "TEVTYPE", 'Type'  }, ;
  457.    { {||EVENT->BONREF}, 'N° Bon',      6,    "TEVCODE", 'Bon' } ;
  458.    }
  459.  
  460. bEval := {|o|o:drawingArea:setColorBG(GRA_CLR_CYAN)}
  461.  
  462. mst = DC_FindBrowse( aFields, nil, nil, nil, 90, 20, ;
  463.     "HISTORIQUE (Cliquer Droit sur en-tête pour changer l'index)", ;
  464.     nil, nil, nil, nil, nil, bEval, ;
  465.     { aPres, { GRA_CLR_DARKGRAY, GRA_CLR_RED } }, ;
  466.     nil, nil, nil, .5 )
  467.  
  468. DC_FindBrowseSort(aSaveSort)
  469.  
  470. IF Mst
  471.   do ZEV
  472. ENDIF
  473.  
  474. CLEAR SCREEN
  475. SELECT EVENT
  476. USE
  477. SELECT(La)
  478. do kon
  479.  
  480. RETURN .T.
  481.  
  482. ***
  483. *
  484. FUNCTION ZEV
  485. LOCAL zbuff:="", t:=0, l:=0, b:=23, r:=79, mt
  486. //
  487. DO HLOFF WITH LCD
  488. do win with t,l,b,r,zbuff, ALLTRIM(EVENT->TYPE)
  489. SELECT EVENT
  490.  
  491. DO CASE
  492.  
  493.    CASE EVENT->TYPE = "FACTURE"
  494.       NET_USE (S_FACT, "FACT", .F., 0, "FACT", "BON")
  495.       SEEK SUBSTR(EVENT->BONREF,1,6)+SUBSTR(EVENT->BONREF,8,2)
  496.       IF .NOT. FOUND().OR. REFCLI<>EVENT->REFCLI
  497.          ALARM ("ERREUR SYSTEME 02 "+REFCLI+" "+EVENT->REFCLI)
  498.       ELSE
  499.          DO FACT WITH .F., .F.
  500.       ENDIF
  501.       USE
  502.  
  503.    CASE EVENT->TYPE = "AVOIR"
  504.       NET_USE (S_AVO, "AVO", .F., 0, "AVREF", "BON")
  505.       SEEK SUBSTR(EVENT->BONREF, 1, LEN(BON->FACTURE))
  506.       IF .NOT. FOUND().OR. REFCLI<>EVENT->REFCLI
  507.          ALARM ("ERREUR SYSTEME 03 "+REFCLI+" "+EVENT->REFCLI)
  508.       ELSE
  509.          DO FACT WITH .F., .T.
  510.       ENDIF
  511.       USE
  512.  
  513.    CASE EVENT->TYPE = "COMMANDE"
  514.       NET_USE (S_COM, "COM", .F., 0, "COM", "BON")
  515.       SEEK SUBSTR(EVENT->BONREF, 1, LEN(BON->COMMANDE))
  516.       IF .NOT. FOUND().OR. REFCLI<>EVENT->REFCLI
  517.          ALARM ("ERREUR SYSTEME 04 "+REFCLI+" "+EVENT->REFCLI)
  518.       ELSE
  519.          DO COMM_OUT
  520.       ENDIF
  521.       USE
  522.  
  523.    OTHERWISE
  524.       DO LIT_INIT
  525.       SEEK SUBSTR(EVENT->BONREF, 1, LEN(LITIGE->CODE))
  526.       // On CDV's machine, may be several visits with the same number
  527.       LOCATE REST FOR CLIENT = EVENT->REFCLI;
  528.                   WHILE CODE = SUBSTR(EVENT->BONREF, 1, LEN(LITIGE->CODE))
  529.       IF .NOT. FOUND()
  530.          ALARM ("ERREUR SYSTEME 01 "+CLIENT+" "+EVENT->REFCLI)
  531.       ELSE
  532.          DO WHILE LASTKEY()<>27
  533.             DO LITFMT WITH 3          // normally delete but doesn't matter
  534.             DO HLON
  535.             mt= "F1-HELP     F2-MENU"
  536.             @ 24,0 CLEAR TO 24,79
  537.             @ 24,40-len(mt)/2 SAY mt
  538.             DO HLOFF WITH LCD
  539.             SET CURSOR OFF
  540.             @ 22,10 SAY""
  541.             set key K_F2 to LITMENU
  542.             wait ""                     // Wait allows function key actvation
  543.          ENDDO
  544.          SET CURSOR OFF
  545.          @ 24,0 CLEAR TO 24,79
  546.          set key K_F2 to
  547.          keyboard CHR(K_ESC)            // Force Exit
  548.       ENDIF
  549.       USE
  550.  
  551. ENDCASE
  552. DO WHILE INKEY()<>27
  553. ENDDO
  554. do wout with t,l,b,r,zbuff
  555. @ 24,0 CLEAR TO 24,79
  556. SELECT EVENT
  557. RETURN .T.
  558. *
  559. ****************************************
  560. *
  561. FUNCTION LITMENU
  562. *.......................................
  563. *
  564. LOCAL MA:= {}, MBUFF1:="", MSel:=SELECT()
  565. LOCAL l:=50, b:=22
  566. LOCAL t,r:=l+22
  567. LOCAL L_CNT, ML, MPL
  568. PRIVATE oPrinter
  569.  
  570. do keysoff
  571. @ 24,0 CLEAR
  572. AADD (MA, "RETOUR")
  573. AADD (MA, "Modifier")
  574. AADD (MA, "Imprimer")
  575. AADD (MA, "Supprimer")
  576. t=b-len(MA)-1
  577. DO WIN WITH t,l,b,r,MBUFF1,"",""
  578. SET COLOR TO &MENUCLR
  579. SET WRAP ON
  580. MCHOIX=ACHOICE(t+1,l+2,b-1,r-2,MA)
  581. DO WOUT WITH t,l,b,r,MBUFF1
  582. DO HLOFF WITH LCD              // Get colour right again
  583.  
  584. DO CASE
  585.  
  586.    CASE MCHOIX=2
  587.       SET CURSOR ON
  588.       DO LITFMT WITH 2         // Modify
  589.       SET CURSOR OFF
  590.  
  591.    CASE MCHOIX=3               // Imprimer
  592. *      SETPRC(0,0)
  593. *      Default_Printer
  594. *      SET DEVICE TO PRINT
  595.  
  596.       DCPRINT ON TO oPrinter
  597.  
  598.       DO PRINT_L
  599.       @ DC_PRINTERROW()+1,0 DCPRINT SAY ""
  600.       L_CNT=MLCOUNT(COMMENTAIR, 62, 4, .T.)
  601.       FOR ML=1 TO L_CNT
  602.           MPL=MEMOLINE(COMMENTAIR,62,ML,4,.T.)
  603.           @ DC_PRINTERROW()+1, 4 DCPRINT SAY MPL
  604.           IF DC_PRINTERROW() > 53
  605.              DCPRINT EJECT
  606.           ENDIF
  607.       NEXT
  608.       
  609.       DCPRINT EJECT
  610.       
  611.       DCPRINT OFF
  612.       
  613. *      Default_Printer
  614. *      SET DEVICE TO SCREEN
  615.  
  616.    CASE MCHOIX=4               // Delete
  617.       IF CONFIRM (18,, "N", "CONFIRMATION SUPPRESSION")
  618.          SELECT EVENT
  619.          REC_LOCK()
  620.          DELETE
  621.          UNLOCK
  622.          SELECT LITIGE
  623.          REC_LOCK()
  624.          DELETE
  625.          UNLOCK
  626.          SELECT(MSel)
  627.          keyboard CHR(K_ESC)   // Force Exit
  628.          RETURN .T.
  629.       ENDIF
  630.  
  631. ENDCASE
  632. keyboard " "      // Force Exit from wait
  633. SELECT(MSel)
  634. RETURN .T.
  635. //
  636. //-----------------------------------------------------------------
  637. //
  638. FUNCTION kon
  639. *.......................................
  640.  
  641. RETURN .T.
  642. **
  643. //
  644. //-----------------------------------------------------------------
  645. //
  646. FUNCTION NONE
  647. *.......................................
  648. parameters t,l,b,r,abuff
  649. *
  650. Alert( "VIDE")
  651. /*DO HLON
  652. do win with t,l,b,r,abuff,"VIDE"
  653. do while INKEY(0) <> K_ESC
  654. enddo
  655. DO HLOFF WITH LCD
  656. do wout with t,l,b,r,abuff
  657. */
  658. RETURN .T.
  659. *
  660. //
  661. //-----------------------------------------------------------------
  662. //
  663. FUNCTION Pg_Up
  664. *.......................................
  665. SCRAM_CLI(SEED)
  666. UNLOCK
  667. SELECT TEMPCLIN
  668. SKIP -1
  669. IF BOF()
  670.    Tone(800)
  671.    GO TOP
  672. ENDIF
  673. SELECT CLIENT
  674. REC_LOCK(0)          // Need lock to unscramble
  675. REC_LOCK(0)
  676. UNSCRAM_CLI(SEED)
  677. FREF=CLIENT->CLIREF
  678. RETURN .T.
  679. //
  680. //-----------------------------------------------------------------
  681. //
  682. FUNCTION Pg_Dn
  683. *.......................................
  684. SCRAM_CLI(SEED)
  685. UNLOCK
  686. SELECT TEMPCLIN
  687. SKIP
  688. IF  EOF()
  689.    Tone(500)
  690.    GO BOTT
  691. ENDIF
  692. SELECT CLIENT
  693. REC_LOCK(0)         // Need lock to unscramble
  694. REC_LOCK(0)
  695. UNSCRAM_CLI(SEED)
  696. FREF=CLIENT->CLIREF
  697. RETURN .T.
  698. //
  699. //-----------------------------------------------------------------
  700. //
  701. FUNCTION Imp_FICHE
  702. *.......................................
  703. DCPRINT ON TO oPrinter
  704.  
  705. Det_Out (2,.F.)      // Line 3, Don't unscramble/scramble
  706. DCPRINT Eject
  707.  
  708. DCPRINT OFF
  709. RETURN .T.
  710. //
  711. //---------------------------------------------------
  712. //
  713. FUNCTION ST               // Choose a Stock Item from a browsed list
  714. LOCAL La, mst, aFields := {}, cKey, cOldColor, nRecSel, nOrder
  715. LOCAL t:=0,l:=0,b:=24,r:=79,Zbuff:="" 
  716.  
  717. LOCAL  aPres, aSort[6], aSaveSort, bEval
  718.  
  719. PARAMETERS ZOOMON,CONTROL  // ZOOMON = .F. does not allow a zoom to full article
  720.                            //    details (e.g. when called from R_ART)
  721. *
  722. *
  723. IF PCOUNT()<>1             // When ST is called on a FN key, PCOUNT=3
  724.                            // Otherwise it is 1 (with param) or 0 (no para.)
  725.    ZOOMON=.T.              // Default=.T. ( MODIFY STOCK gives PCOUNT()= 1)
  726. ENDIF
  727. IF PCOUNT()<>2
  728.    CONTROL=4               // default is NOT READ
  729. ENDIF
  730. IF PCOUNT()<>3
  731.    FROMSTM=.T.             // Called by R_ART, Client may not be set up
  732. ENDIF
  733.  *
  734. DO KEYSOFF
  735. La=SELECT()
  736. select STOCK
  737. nOrder=INDEXORD()
  738. GO TOP
  739.  
  740. aSort[1] := GRA_CLR_WHITE // Sort Selected Color (Foreground)
  741. aSort[2] := GRA_CLR_RED   // Sort Selected Color (Background)
  742. aSort[3] := GRA_CLR_WHITE // Sort Unselected Color (Foreground)
  743. aSort[4] := GRA_CLR_DARKGRAY // Sort Unselected Color (Background)
  744. aSort[5] := BITMAP_RD_UP_RED  // Sort UP Bitmap
  745. aSort[6] := BITMAP_RD_DOWN_RED  // Sort DOWN Bitmap
  746.  
  747. aSaveSort := DC_FindBrowseSort(aSort)
  748.  
  749. aPres := ;
  750.   { { XBP_PP_COL_HA_FGCLR, GRA_CLR_WHITE },  ;
  751.     { XBP_PP_COL_HA_BGCLR, GRA_CLR_DARKGRAY }, ;
  752.     { XBP_PP_COL_DA_FGCLR, GRA_CLR_BLACK }, ;
  753.     { XBP_PP_COL_DA_BGCLR, GRA_CLR_WHITE } }
  754.  
  755. aPres := ;
  756.   { { XBP_PP_COL_HA_FGCLR, GRA_CLR_WHITE },  ;
  757.     { XBP_PP_COL_HA_BGCLR, GRA_CLR_DARKGRAY }, ;
  758.     { XBP_PP_COL_DA_FGCLR, GRA_CLR_BLACK }, ;
  759.     { XBP_PP_COL_DA_BGCLR, GRA_CLR_WHITE } }
  760.  
  761. aFields := ;
  762.    { ; // field            Header   Width  Index       Prompt
  763.    { {||STOCK->STCOMMREF}, 'Réf',         5,    "STCREF", 'Référence' } , ;
  764.    { {||STOCK->STLIB},     'Libellé',    25,    "STRLIB",  "Libellé" }, ;
  765.    { {||STOCK->STPRIXVTR}, 'Prix Tarif',  5,    nil,     nil }, ;
  766.    { {||STOCK->STCESSTR},  'Cession',     5,    nil,     nil }, ;
  767.    { {||STOCK->POIDS},     'Poids',       4,    nil,     nil } ;
  768.    }
  769.  
  770. bEval := {|o|o:drawingArea:setColorBG(GRA_CLR_CYAN)}
  771.  
  772. mst = DC_FindBrowse( aFields, nil, nil, nil, 90, 20, ;
  773.     "A R T I C L E S (Cliquer Droit sur en-tête pour changer l'index)", ;
  774.     nil, nil, nil, nil, nil, bEval, ;
  775.     { aPres, { GRA_CLR_DARKGRAY, GRA_CLR_RED } }, ;
  776.     nil, nil, nil, .5 )
  777.  
  778. DC_FindBrowseSort(aSaveSort)
  779.  
  780. SELECT(La)
  781. RETURN .T.
  782. **********************************
  783. *
  784. FUNCTION R_ART ( R,C,MART )
  785. LOCAL La
  786. La=SELECT()
  787. SELECT STOCK
  788. IF PCOUNT()<3
  789.    MART=SPACE(LEN(STOCK->STCOMMREF))
  790. ENDIF
  791. SET KEY K_F5 TO ZRART    // F5 for tarift pick list
  792. @ R,C GET MART
  793. READ
  794. SET KEY K_F5 TO
  795. IF LEN(TRIM(MART))>0 .AND. VAL(MART)<>0
  796.    MART=PAD(MART,LEN(MART))
  797. ENDIF
  798. SELECT(La)
  799. RETURN MART
  800.  
  801. ******
  802. FUNCTION ZRART
  803. CLEAR GETS
  804. DO ST WITH .F.            // no ZOOMON
  805. IF LASTKEY()<>K_ESC
  806.    MART=STCOMMREF
  807. ENDIF
  808. RETURN .T.
  809. //
  810. //-----------------------------------------------------
  811. //
  812. FUNCTION LAST_VISIT (Ro, Co, Print)
  813.  
  814. // Finds the last visit to the client.
  815. // If called by display (Print = .F.) displays info
  816. // if called from print (Print = .T.) RETURNs the memo or nothing
  817.  
  818. LOCAL La:=SELECT(), LVis:=0, MRet := ""
  819. DEFAULT Print TO .F.
  820.  
  821. IF .NOT. Print
  822.    @ Ro,    1       SAY "DERNIERE VISITE : "
  823.    @ ROW(), COL()   SAY  CLIENT->DERNVISIT
  824.    @ ROW(), COL()+3 SAY "ACTION AVANT LE : "
  825.    @ ROW(), COL()   GET  CLIENT->RELANCE
  826. ENDIF
  827.  
  828. NET_USE (S_EVENT, "EVENT",  .F., 30, "EVENT", "")
  829. SEEK CLIENT->CLIREF
  830. IF FOUND()
  831.    DO WHILE REFCLI = CLIENT->CLIREF .AND. .NOT. EOF()
  832.       IF ALLTRIM(EVENT->TYPE) $ "VISITETELEPHONE"
  833.          LVis=RECNO()       // Find the last visit
  834.          exit               // Index now in descending order
  835.       ENDIF
  836.       SKIP
  837.    ENDDO
  838.    IF LVis <> 0
  839.       GO LVis
  840.       DO LIT_INIT
  841.       SEEK SUBSTR(EVENT->BONREF, 1, LEN(LITIGE->CODE))
  842.       // On CDV's machine, may be several visits with the same number
  843.       LOCATE REST FOR CLIENT = EVENT->REFCLI;
  844.                   WHILE CODE = SUBSTR(EVENT->BONREF, 1, LEN(LITIGE->CODE))
  845.       IF Print
  846.          MRet = IF(FOUND(), LITIGE->COMMENTAIR, "")
  847.       ELSE
  848.          IF .NOT. FOUND()
  849.             ALARM ("ERREUR SYSTEME 01 "+CLIENT+" "+EVENT->REFCLI)
  850.          ELSE
  851.             MEMOEDIT(LITIGE->COMMENTAIR,Ro+1,Co,22,74,.F.,.F.)    // Browse
  852.          ENDIF
  853.          //
  854.          // CLose files opened by LIT_INIT
  855.          //
  856.          SELECT LITIGE
  857.          USE
  858.          SELECT LITREG
  859.          USE
  860.          SELECT LITCOD
  861.          USE
  862.       ENDIF
  863.    ENDIF
  864. ENDIF
  865.  
  866. SELECT EVENT
  867. USE
  868.  
  869. SELECT(La)
  870. RETURN MRet
  871. //
  872. //-----------------------------------------------------
  873. //
  874. FUNCTION R_CLI(CRE_CLI)
  875.  
  876. LOCAL nEvent, mp1, mp2
  877. LOCAL oDlg, oXbp, drawingArea, aEditControls := {}, oXbp1
  878. LOCAL ActiBox, GamBox, oXbpFax, oXbpRel, oRb1, oRb2, oRb3
  879.  
  880. LOCAL MREF,  M_Gam, M_Fax, M_T_Min 
  881. LOCAL M_REL, Mix_Array := {}
  882. LOCAL M_Dat_Base := CTOD("01/01/89")
  883. LOCAL La := SELECT(), i
  884.  
  885. // M_FILTER, M_CLIC, M_TEL, M_ACT, CLIN, MCP, M_CLIP, T_Min
  886. // M_Dat1, M_Dat2, M_R_S, M_R_E
  887. // are all defined as PUBLIC in MAIN
  888.  
  889.  
  890. IF PCOUNT()=0
  891.    CRE_CLI=.F.
  892. ENDIF
  893.  
  894. F_Ran= RANDOM (SEED, 5, 31)   // Generate 5 random n°s between 1 and 31
  895.  
  896. AADD (Mix_Array, "49-900    ")
  897. AADD (Mix_Array, "SECURIFRAN")
  898. AADD (Mix_Array, "42-700    ")
  899. AADD (Mix_Array, "ROULANT   ")
  900. AADD (Mix_Array, "CH49/AUTO ")
  901. AADD (Mix_Array, "PLANCHERS ")
  902. AADD (Mix_Array, "DIFFUSION ")
  903. AADD (Mix_Array, "DIVERS    ")
  904.  
  905. DO WHILE .T.
  906.    SET FILTER TO
  907.    Mret = 1                           // RETURN Value
  908.    M_FILTER = "VAL(CLISTATUS)<3"      // Initialise the selection
  909.  
  910.   SELECT CLIENT
  911.    SET ORDER TO 1                     // Index by Reference
  912.    GO TOP
  913.  
  914.    MFREF=SPACE(LEN(CLIREF))
  915.    CLIN= SPACE(LEN(CLINOM))
  916.    MCP=  SPACE(LEN(CLICP))
  917.    M_CLIC= SPACE(LEN(CLICONTACT))
  918.    M_TEL = SPACE(LEN(CLIPHONE))
  919.    M_ACT = SPACE(LEN(CLIPROFESS))
  920.    M_Gam=''
  921.    M_Fax='N'
  922.    M_T_Min = ""
  923.    M_CLIP =''
  924.    M_REL = 'N'
  925.    M_Dat1 = M_Dat_Base
  926.    M_Dat2 = M_Dat1
  927.    M_R_S = CTOD("01/01/89")
  928.    M_R_E = DATE() + 30
  929.    
  930.    oDlg := XbpDialog():new( AppDesktop(), , {353,205}, {600,400}, , .F.)
  931.    oDlg:taskList := .T.
  932.    oDlg:title := "SELECTION"
  933.    oDlg:create()
  934.  
  935.    drawingArea := oDlg:drawingArea
  936.    drawingArea:setFontCompoundName( "8.Arial" )
  937.  
  938.    oXbp1 := XbpStatic():new( drawingArea, , {40,252}, {348,108} )
  939.    oXbp1:caption := ""
  940.    oXbp1:clipSiblings := .T.
  941.    oXbp1:type := XBPSTATIC_TYPE_GROUPBOX
  942.    oXbp1:create()
  943.  
  944.    oXbp := XbpStatic():new( oXbp1, , {12,60}, {120,24} )
  945.    oXbp:caption := "NOM DU CLIENT :"
  946.    oXbp:clipSiblings := .T.
  947.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  948.    oXbp:create()
  949.  
  950.    oXbp := XbpSLE():new( oXbp1, , {144,60}, {192,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  951.    oXbp:bufferLength := 30
  952.    oXbp:tabStop := .T.
  953.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIN ), CLIN := x ) }
  954.    oXbp:create():setData()
  955.    AAdd ( aEditControls, oXbp )
  956.    SetAppFocus(oXbp)
  957.    
  958.    oXbp := XbpStatic():new( oXbp1, , {24,36}, {108,24} )
  959.    oXbp:caption := "CODE POSTALE :"
  960.    oXbp:clipSiblings := .T.
  961.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  962.    oXbp:create()
  963.  
  964.    oXbp := XbpSLE():new( oXbp1, , {144,36}, {36,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  965.    oXbp:bufferLength := 5
  966.    oXbp:tabStop := .T.
  967.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( MCP ), MCP := x ) }
  968.    oXbp:create():setData()
  969.    AAdd ( aEditControls, oXbp )
  970.  
  971.    oXbp := XbpStatic():new( oXbp1, , {36,12}, {96,24} )
  972.    oXbp:caption := "NUMERO CLIENT :"
  973.    oXbp:clipSiblings := .T.
  974.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  975.    oXbp:create()
  976.  
  977.    oXbp := XbpSLE():new( oXbp1, , {144,12}, {72,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  978.    oXbp:bufferLength := 10
  979.    oXbp:tabStop := .T.
  980.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( MFREF ), MFREF := x ) }
  981.    oXbp:create():setData()
  982.    AAdd ( aEditControls, oXbp )
  983.  
  984.  
  985.    oXbp := XbpPushButton():new( drawingArea, , {420,252},  {84,24},;
  986.              { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
  987.    oXbp:caption := "GO"
  988.    oXbp:tabStop := .T.
  989.    oXbp:create()
  990.    oXbp:activate := {|| Gather( aEditControls ), PostAppEvent( xbeP_Quit ) }
  991.  
  992.  
  993.    oXbp := XbpStatic():new( drawingArea, , {108,216}, {120,24} )
  994.    oXbp:caption := "CONTACT :"
  995.    oXbp:clipSiblings := .T.
  996.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  997.    oXbp:create()
  998.  
  999.    oXbp := XbpSLE():new( drawingArea, , {240,216}, {108,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  1000.    oXbp:bufferLength := 17
  1001.    oXbp:tabStop := .T.
  1002.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( M_CLIC ), M_CLIC := x ) }
  1003.    oXbp:create():setData()
  1004.    AAdd ( aEditControls, oXbp )
  1005.  
  1006.    oXbp := XbpStatic():new( drawingArea, , {108,192}, {120,24} )
  1007.    oXbp:caption := "ACTIVITE :"
  1008.    oXbp:clipSiblings := .T.
  1009.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  1010.    oXbp:create()
  1011.  
  1012.    ActiBox := XbpCombobox():new( drawingArea, , {240,132}, {74,84}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  1013.    ActiBox:tabstop := .T.
  1014.    ActiBox:create()
  1015.    ActiBox:Additem ("MACO")
  1016.    ActiBox:Additem ("COUV")
  1017.    ActiBox:Additem ("PEIN")
  1018.    ActiBox:Additem ("FACA")
  1019.    ActiBox:Additem ("CHAR")
  1020.    ActiBox:Additem ("ISOL")
  1021.    ActiBox:Additem ("PLAT")
  1022.    ActiBox:Additem ("INDU")
  1023.    ActiBox:Additem ("LOCA")
  1024.    ActiBox:Additem ("DIVS")
  1025.    ActiBox:Additem ("CETC")
  1026.  
  1027.    oXbp := XbpStatic():new( drawingArea, , {96,168}, {132,24} )
  1028.    oXbp:caption := "EQUIPEE FAX :"
  1029.    oXbp:clipSiblings := .T.
  1030.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  1031.    oXbp:create()
  1032.  
  1033.    oXbpFax := XbpCheckBox():new( drawingArea, , {240,168}, {96,24} )
  1034.    oXbpFax:tabStop := .T.
  1035.    oXbpFax:create()
  1036.    oXbpFax:setData (.F.)
  1037.    oXbpFax:selected := {|| NIL }
  1038.  
  1039.    oXbp := XbpStatic():new( drawingArea, , {84,144}, {144,24} )
  1040.    oXbp:caption := "CLIENT/PROSPECT/TOUS :"
  1041.    oXbp:clipSiblings := .T.
  1042.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  1043.    oXbp:create()
  1044.  
  1045.    oRb1 := XbpRadioButton():new( drawingArea, , {240,144}, {48,24} )
  1046.    oRb1:caption := "Client"
  1047.    oRb1:tabStop := .T.
  1048.    oRb1:create()
  1049.    oRb1:selected := {|| NIL }
  1050.  
  1051.    oRb2 := XbpRadioButton():new( drawingArea, , {288,144}, {60,24} )
  1052.    oRb2:caption := "Prospect"
  1053.    oRb2:tabStop := .T.
  1054.    oRb2:create()
  1055.    oRb2:selected := {|| NIL }
  1056.  
  1057.    oRb3 := XbpRadioButton():new( drawingArea, , {360,144}, {120,24} )
  1058.    oRb3:caption := "Tous"
  1059.    oRb3:tabStop := .T.
  1060.    oRb3:selection := .T.
  1061.    oRb3:create()
  1062.    oRb3:selected := {|| NIL }
  1063.  
  1064.    oXbp := XbpStatic():new( drawingArea, , {132,120}, {96,24} )
  1065.    oXbp:caption := "TAILLE MINIMUM :"
  1066.    oXbp:clipSiblings := .T.
  1067.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  1068.    oXbp:create()
  1069.  
  1070.    oXbp := XbpSLE():new( drawingArea, , {240,120}, {36,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  1071.    oXbp:bufferLength := 4
  1072.    oXbp:tabStop := .T.
  1073.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, M_T_Min, M_T_Min := x ) }
  1074.    oXbp:create():setData()
  1075.    AAdd ( aEditControls, oXbp )
  1076.  
  1077.    oXbp := XbpStatic():new( drawingArea, , {84,96}, {144,24} )
  1078.    oXbp:caption := "GAMME MEFRAN :"
  1079.    oXbp:clipSiblings := .T.
  1080.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  1081.    oXbp:create()
  1082.  
  1083.    GamBox := XbpCombobox():new( drawingArea, , {240,36}, {94,84}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  1084.    GamBox:tabstop := .T.
  1085.    GamBox:create()
  1086.    FOR i = 1 TO LEN(Mix_Array)
  1087.       GamBox:Additem  (Mix_Array[i])
  1088.    NEXT
  1089.  
  1090.    oXbp := XbpStatic():new( drawingArea, , {84,72}, {144,24} )
  1091.    oXbp:caption := "A RELANCER :"
  1092.    oXbp:clipSiblings := .T.
  1093.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  1094.    oXbp:create()
  1095.  
  1096.    oXbpRel := XbpCheckBox():new( drawingArea, , {240,72}, {24,24} )
  1097.    oXbpRel:tabStop := .T.
  1098.    oXbpRel:create()
  1099.    oXbpRel:selected := {|| NIL }
  1100.  
  1101.    oXbp := XbpStatic():new( drawingArea, , {264,72}, {72,24} )
  1102.    oXbp:caption := " AVANT LE :"
  1103.    oXbp:clipSiblings := .T.
  1104.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  1105.    oXbp:create()
  1106.  
  1107.    oXbp := XbpSLE():new( drawingArea, , {336,72}, {60,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  1108.    oXbp:tabStop := .T.
  1109.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, DtoC( M_R_E ), M_R_E := CtoD(x) ) }
  1110.    oXbp:create():setData()
  1111.    AAdd ( aEditControls, oXbp )
  1112.  
  1113.    oXbp := XbpStatic():new( drawingArea, , {396,72}, {60,24} )
  1114.    oXbp:caption := "APRES LE :"
  1115.    oXbp:clipSiblings := .T.
  1116.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  1117.    oXbp:create()
  1118.  
  1119.    oXbp := XbpSLE():new( drawingArea, , {456,72}, {60,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  1120.    oXbp:tabStop := .T.
  1121.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, DtoC( M_R_S ), M_R_S := CtoD(x) ) }
  1122.    oXbp:create():setData()
  1123.    AAdd ( aEditControls, oXbp )
  1124.  
  1125.    oXbp := XbpStatic():new( drawingArea, , {84,48}, {144,24} )
  1126.    oXbp:caption := "PAS VISITE DEPUIS :"
  1127.    oXbp:clipSiblings := .T.
  1128.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  1129.    oXbp:create()
  1130.  
  1131.    oXbp := XbpSLE():new( drawingArea, , {240,48}, {60,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  1132.    oXbp:bufferLength := 10
  1133.    oXbp:tabStop := .T.
  1134.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, DtoC( M_Dat1 ), M_Dat1 := CtoD(x) ) }
  1135.    oXbp:create():setData()
  1136.    AAdd ( aEditControls, oXbp )
  1137.  
  1138.    oXbp := XbpStatic():new( drawingArea, , {84,24}, {144,24} )
  1139.    oXbp:caption := "PAS COMMANDE DEPUIS :"
  1140.    oXbp:clipSiblings := .T.
  1141.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  1142.    oXbp:create()
  1143.  
  1144.    oXbp := XbpSLE():new( drawingArea, , {240,24}, {60,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  1145.    oXbp:bufferLength := 10
  1146.    oXbp:tabStop := .T.
  1147.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, DtoC( M_Dat2 ), M_Dat2 := CtoD(x) ) }
  1148.    oXbp:create():setData()
  1149.    AAdd ( aEditControls, oXbp )
  1150.  
  1151.    oDlg:show()
  1152.  
  1153.    nEvent := xbe_None
  1154.    DO WHILE nEvent <> xbeP_Close .AND. nEvent <>xbeP_Quit
  1155.       nEvent := AppEvent( @mp1, @mp2, @oXbp )
  1156.       oXbp:handleEvent( nEvent, mp1, mp2 )
  1157.    ENDDO
  1158.   
  1159.    IF LastAppEvent()= xbeP_Close
  1160.          Mret=0                          // Client not selected
  1161.       EXIT
  1162.    ENDIF
  1163.  
  1164.    //
  1165.    // Get the data and see if the user has specified anything interesting
  1166.    //
  1167.    M_Act = ALLTRIM(ActiBox:xbpSLE:getdata())
  1168.    M_Gam = ALLTRIM(GamBox:xbpSLE:getdata())
  1169.    M_Fax = IIF(oXbpFax:GetData(), "O", "N")  
  1170.    M_Rel = IIF(oXbpRel:GetData(), "O", "N")
  1171.    T_Min = INT(VAL(M_T_Min))
  1172.    // Radio Buttons
  1173.    IF oRB3:GetData()
  1174.       M_Clip = ""
  1175.    ELSEIF oRB2:GetData()      
  1176.       M_Clip = "P"
  1177.    ELSE
  1178.       M_Clip = "C"
  1179.    ENDIF
  1180.  
  1181.    IF .NOT. EMPTY (MFREF)
  1182.       //
  1183.       // If the reference is specified, all other parameters are irrelevant,
  1184.       // but if they are specified, the user may want to create a new client
  1185.       //
  1186.       IF .NOT. EMPTY(CLIN).AND. .NOT. EMPTY(MCP);
  1187.          .AND. CRE_CLI .AND. SUBSTR(MFREF,1,1)="*"
  1188.             IF CONFIRM (11,5,"O","Créer un prospect ? ")
  1189.             //
  1190.             // Create a new prospect: a prospect becomes a
  1191.             // client when he orders something
  1192.             //
  1193.             NET_USE (S_ATTACH, "ATTACH", .T., 0, "", "")
  1194.             DO WHILE .T.
  1195.                SELECT ATTACH
  1196.  
  1197.                // Allocate next number
  1198.  
  1199.                FREF=SUBSTR(MCP,1,2) + SUBSTR(M_Resp,2,2) + PAD(STR(NUM_CLI),5)
  1200.                REPLACE NUM_CLI WITH NUM_CLI+1
  1201.                SELECT CLIENT
  1202.                SEEK "C"+FREF
  1203.                IF FOUND()
  1204.                   LOOP        // Try the next available prospect number
  1205.                ENDIF
  1206.                SEEK "P" + FREF
  1207.                IF .NOT. FOUND()
  1208.                   FREF= "P" + FREF
  1209.                   Mret = 1
  1210.                   EXIT        // O.K. found a valid number
  1211.                ENDIF
  1212.             ENDDO
  1213.             SELECT ATTACH
  1214.             USE
  1215.             SELECT CLIENT
  1216.             ADD_REC(0)
  1217.             REPLACE CLIREF      WITH FREF,;
  1218.                     CLINOM      WITH CLIN,;
  1219.                     CLICP       WITH MCP,;
  1220.                     CLIREGION   WITH M_Resp,;
  1221.                     CLISCRAMBLE WITH .F.
  1222.             Window_Cli (1)
  1223.             SCRAM_CLI (SEED)
  1224.             LOOP
  1225.          ENDIF
  1226.       ELSE
  1227.          //
  1228.          // Not Prospect creation, try to find client
  1229.          //
  1230.          SET ORDER TO 1   // CLREF
  1231.          SEEK MFREF
  1232.          IF FOUND() .AND. VAL(CLISTATUS)<3  // Not deleted
  1233.             Mret=2                          // straight to client
  1234.             EXIT
  1235.          ENDIF
  1236.          FREF= "P" + SUBSTR(MFREF,2,LEN(CLIENT->CLIREF)-1)
  1237.          SEEK FREF
  1238.          IF FOUND() .AND. VAL(CLISTATUS) < 3
  1239.             ALARM ("ATTENTION - C'est un PROSPECT pas un CLIENT")
  1240.             Mret=2                        // straight to client
  1241.             EXIT
  1242.          ENDIF
  1243.          
  1244.          ALARM ("NUMERO CLIENT INEXISTANT OU CLIENT SUPPRIME")
  1245.          // Shouldn't normally create a client because
  1246.          // he should previously have been a prospect.
  1247.          // Nevertheless, allow creation if the user insists!
  1248.          IF .NOT. EMPTY(CLIN) .AND. .NOT. EMPTY(MCP);
  1249.             .AND. CRE_CLI .AND. CONFIRM (11,5,"O","Créer un Client ? ")
  1250.             SELECT CLIENT
  1251.             ADD_REC(0)
  1252.             REPLACE CLIREF      WITH MFREF,;
  1253.                     CLINOM      WITH CLIN,;
  1254.                     CLICP       WITH MCP,;
  1255.                     CLIREGION   WITH M_Resp,;
  1256.                     CLISCRAMBLE WITH .F.
  1257.             Window_Cli (1)
  1258.             SCRAM_CLI (SEED)
  1259.          ENDIF
  1260.          LOOP
  1261.       ENDIF
  1262.    ELSE
  1263.       //
  1264.       // FREF not specified, try the other keys
  1265.       //
  1266.       //
  1267.       // Now set up filter or choose client
  1268.       //
  1269.       IF .NOT. EMPTY(M_CLIC)      // "CLIENT"-type condition
  1270.          SET ORDER TO 0
  1271.          LOCATE FOR CLICONTACT = SCRAMBLE (M_CLIC,;
  1272.                                   RANDOM(REC_SEED (SEED), 30, 31));
  1273.                             .AND. VAL(CLISTATUS) < 3
  1274.          IF FOUND()
  1275.             SET ORDER TO 1
  1276.             Mret=2                     // straight to client
  1277.             EXIT
  1278.          ENDIF
  1279.             ALARM ("CLIENT INEXISTANT OU SUPPRIME")
  1280.          LOOP
  1281.       ELSE
  1282.          IF .NOT. EMPTY(M_ACT)
  1283.             //
  1284.             // M_ACT is set up which is a FILTER type condition
  1285.             //
  1286.             M_FILTER = M_FILTER + ".AND.CLIPROFESS=M_ACT"
  1287.          ENDIF
  1288.          //
  1289.          // Fax ?
  1290.          //
  1291.          IF M_Fax = 'O'
  1292.             M_FILTER = M_FILTER+".AND.CLIFAX<>SCRAMBLE(SPACE(15),"+;
  1293.                                       "RANDOM(REC_SEED (SEED), 30, 31))"
  1294.          ENDIF
  1295.          //
  1296.          // Client/Prospect ?
  1297.          //
  1298.          IF M_CLIP <> ' '
  1299.             M_FILTER = M_FILTER+".AND.CLIREF=M_CLIP"
  1300.          ENDIF
  1301.          //
  1302.          // Taille Mini ?
  1303.          //
  1304.          IF T_Min > 0
  1305.             M_FILTER = M_FILTER+".AND.VAL(CLITAILLE)>=T_Min"
  1306.          ENDIF
  1307.          //
  1308.          // Gamme MEFRAN ?
  1309.          IF .NOT. EMPTY(M_Gam)
  1310.             SET EXACT OFF
  1311.             i = ASCAN(PADR(M_Gam, LEN(Mix_Array[1])), Mix_Array)
  1312.             SET EXACT ON
  1313.             IF I<>0
  1314.                M_FILTER = M_FILTER+".AND.Q_"+STR(I,1)+"<>0"
  1315.             ENDIF
  1316.          ENDIF
  1317.          IF M_REL='O'
  1318.             M_FILTER=M_FILTER+".AND.RELANCE>=M_R_S.AND.RELANCE<M_R_E"
  1319.          ENDIF
  1320.          IF M_Dat1>M_Dat_Base
  1321.             M_FILTER=M_FILTER+".AND.DERNVISIT<M_Dat1"
  1322.          ENDIF
  1323.          IF M_Dat2>M_Dat_Base
  1324.             M_FILTER=M_FILTER+".AND.DCANNEE<M_Dat2"
  1325.          ENDIF
  1326.       ENDIF
  1327.    ENDIF
  1328.    CLIN=ALLTRIM(CLIN)
  1329.    MCP=ALLTRIM(MCP)
  1330.    SET EXACT OFF
  1331.    Mret = 1
  1332.    //
  1333.    // Select the search method and complete the filter condition
  1334.    //
  1335.    IF .NOT. EMPTY(CLIN)
  1336.       //
  1337.       // Scramble the data so as to be the same as the file
  1338.       //
  1339.       CLIN = SCRAMBLE (IIF(LEN(CLIN)<= 5,CLIN,SUBSTR(CLIN,1,5)),F_Ran)
  1340.       //
  1341.       // Search by NAME
  1342.       //
  1343.       SET ORDER TO 2         // CLINOM
  1344.       IF .NOT. EMPTY(MCP)
  1345.          M_FILTER=M_FILTER+".AND.CLICP=MCP"
  1346.       ENDIF
  1347.       SEEK CLIN
  1348.       COPY TO C:TEMPCLIN FIELDS CLIREF FOR &M_FILTER WHILE CLIENT->CLINOM=CLIN
  1349.  
  1350.    ELSEIF .NOT. EMPTY(MCP)
  1351.       //
  1352.       // Search by C.P.
  1353.       //
  1354.       SET ORDER TO 3         // CLICP
  1355.       SEEK MCP
  1356.       COPY TO C:TEMPCLIN FIELDS CLIREF FOR &M_FILTER WHILE CLIENT->CLICP=MCP
  1357.  
  1358.    ELSE
  1359.       //
  1360.       // Search whole file
  1361.       //
  1362.       SET ORDER TO 0
  1363.       GO TOP
  1364.       COPY TO C:TEMPCLIN FIELDS CLIREF FOR &M_FILTER
  1365.    ENDIF
  1366.    EXIT
  1367.  
  1368. ENDDO
  1369.  
  1370. SET ORDER TO 1                 // Whatever happened
  1371. IF Mret <> 0 .AND. Mret <> 2   // Client not selected
  1372.    NET_USE (S_TEMP2, "C:TEMPCLIN", .T., 0, "", "")
  1373.    IF RECCOUNT() = 0
  1374.       oDlg : close()
  1375.       oDlg : Destroy()
  1376.       Alarm("Vide")            // Error Message
  1377.       SELECT (La)
  1378.       RETURN-1
  1379.    ELSE
  1380.       COUNT TO N_Cli FOR CLIREF<>"P"
  1381.       N_Rec=RECCOUNT()
  1382.       GO TOP
  1383.       SET RELATION TO CLIREF INTO CLIENT
  1384.    ENDIF
  1385. ENDIF
  1386. SET EXACT ON
  1387. SET SOFTSEEK OFF
  1388.  
  1389. oDlg : close()
  1390. oDlg : Destroy()
  1391.  
  1392. SELECT (La)
  1393. RETURN Mret
  1394.  
  1395. *
  1396. ***************************
  1397. *
  1398. FUNCTION R_CLI2 ()
  1399. //
  1400. LOCAL La, aFields := {},  cOldColor, nRecSel, FREF
  1401.  
  1402. La=SELECT()
  1403. SELECT TEMPCLIN
  1404. IF RECCOUNT()=0               // Was a single record which has been deleted
  1405.    SELECT (La)
  1406.    RETURN ""
  1407. ENDIF
  1408. F_Ran= RANDOM (SEED, 5, 31)   // Generate 5 random n°s between 1 and 31
  1409. cOldColor := SetColor()
  1410. AADD(aFields, {" REF",   {||IIF(CLIENT->CLIRISQUE<>" ",;
  1411.                               "*"+CLIREF,;
  1412.                               " "+CLIREF)}, 6 } )
  1413. AADD(aFields, {"NOM" ,  {||UNS_NOM(CLIENT->CLINOM)}, 18 } )
  1414. AADD(aFields, {"C.P.",  {||CLIENT->CLICP }, 3 } )
  1415. AADD(aFields, {"VILLE", {||UNS_NOM(SUBSTR(CLIENT->CLIVILLE,1,20))}, 13} )
  1416. AADD(aFields, {"TEL",   {||UNS_FIELD(CLIENT->CLIPHONE) }, 8 } )
  1417. AADD(aFields, {"PROF",  {||CLIENT->CLIPROFESS }, 3 } )
  1418. AADD(aFields, {"F.J.",  {||CLIENT->CLIABV }, 3 } )
  1419. SET EXACT OFF
  1420. SET SOFTSEEK OFF
  1421.  
  1422. nRecSel:= CL_BRWSWHL(aFields)
  1423.  
  1424. FREF = DECODE_REPLY (nRecSel)
  1425. SET EXACT ON
  1426. SELECT (La)
  1427. SetColor (cOldColor)
  1428. RETURN FREF
  1429. *
  1430. //
  1431. //-------------------------------------------------------------------------
  1432. //
  1433. FUNCTION DECODE_REPLY (nRecSel)
  1434. //
  1435. LOCAL mbuff:=""
  1436.  
  1437. DO CASE
  1438.    CASE  nRecSel == 0
  1439.       RETURN ""        // No record selected (Esc)
  1440.    CASE nRecSel < 0    // No matching Record
  1441.        Alarm ("Vide")
  1442. *      DO HLON
  1443. *      do win with 18,1,20,78,mbuff,"VIDE"
  1444. *      do while INKEY(0) <> K_ESC
  1445. *      enddo
  1446. *      DO HLOFF WITH LCD
  1447.       RETURN ""
  1448.    OTHERWISE
  1449.       RETURN CLIENT->CLIREF
  1450. ENDCASE
  1451. RETURN ""
  1452. //
  1453. //-------------------------------------------------------------------------
  1454. //
  1455. FUNCTION UNS_NOM(Nom)
  1456. //
  1457. // Returns an unscrambled client name or VILLE. Used by R_CLI
  1458. //
  1459. LOCAL M, La
  1460. //
  1461. // Set up global variables
  1462. //
  1463. // F_Ran already set up by R_CLI
  1464. La=SELECT()
  1465. SELECT CLIENT
  1466. V_Ran= RANDOM(REC_SEED (SEED), LEN(Nom)-5, 31)    // 25 codes.
  1467. M    = UNSCRAMBLE (SUBSTR(Nom,1,5), F_Ran)
  1468. M = M +  UNSCRAMBLE (SUBSTR(Nom, 6, LEN(Nom)-5), V_Ran)
  1469. SELECT(La)
  1470. RETURN M
  1471. //
  1472. //-------------------------------------------------------------------------
  1473. //
  1474. FUNCTION UNS_FIELD(Nom)
  1475. //
  1476. // Returns an unscrambled field
  1477. //
  1478. LOCAL M, La
  1479. //
  1480. // Set up global variables
  1481. //
  1482. // F_Ran already set up by R_CLI
  1483. La=SELECT()
  1484. SELECT CLIENT
  1485. V_Ran= RANDOM(REC_SEED (SEED), LEN(Nom), 31)    // 25 codes.
  1486. M    = UNSCRAMBLE (Nom, V_Ran)
  1487. SELECT(La)
  1488. RETURN M
  1489. //
  1490. ********************************
  1491.  
  1492. *
  1493. FUNCTION V_Proff(Proff)
  1494. //
  1495. // Validates the Profession Code in the current record
  1496. // Uses the string ValidProff from PARAMS
  1497. //
  1498. RETURN EMPTY(Proff) .OR. Proff+"," $ ValidProff
  1499. //
  1500. //--------------------------------------------
  1501. //
  1502. FUNCTION SIRET (Code)
  1503. LOCAL I:=1, J, Tot:=0
  1504.  
  1505. Code = ALLTRIM (Code)
  1506. IF EMPTY(Code)
  1507.    RETURN .T.
  1508. ENDIF
  1509. IF LEN(Code) <> 14
  1510.    RETURN .F.
  1511. ENDIF
  1512. //
  1513. // For the time being ......
  1514. //
  1515. return .T.
  1516. //
  1517. DO WHILE I < 14
  1518.    J=VAL(SUBSTR(Code,I,1))*2
  1519.    J=IIF(J>10, J-9, J)
  1520.    Tot = Tot + J + VAL(SUBSTR(Code, I+1, 1))
  1521.    I=I+2
  1522. ENDDO
  1523. RETURN MOD(Tot, 10) = 0
  1524. //
  1525. /* ------------------------------------------------------------------- */
  1526. //
  1527. FUNCTION CL_BRWSWHL(aFields)
  1528.  
  1529. LOCAL nEvent, mp1, mp2, oXbp, oBut, oBrowse, aSize, i
  1530. LOCAL oLdWin,  TheElement
  1531. PRIVATE ChosenClient:=0
  1532.  
  1533.    oXbp := GuiStdDialog( "Sélection CLIENT/PROSPECT", {10,100}, {675,400})
  1534.  
  1535.    oBut := XbpPushButton():new( oXbp:drawingArea, , {295,3}, {84,24},;
  1536.                                 { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
  1537.    oBut:caption := "Impression"
  1538.    oBut:tabStop := .T.
  1539.    oBut:create()
  1540.    oBut:activate := {|| PRINT_CLI() }
  1541.  
  1542.    // create browser in window
  1543.    aSize = oXbp:drawingarea:currentsize()
  1544.    aSize[2] = aSize[2] - 30
  1545.    oBrowse := GuiBrowseDb( oXbp:drawingArea, {0,30}, aSize )
  1546.  
  1547.    FOR i = 1 TO LEN(aFields)
  1548.  
  1549.       /* make the new column  - Contents, size, header*/
  1550.       oBrowse:addColumn(aFields[i, 2],aFields[i, 3] , aFields[i, 1] )
  1551.    NEXT
  1552.    oBrowse:CursorMode:=XBPBRW_CURSOR_ROW
  1553.    // overload resize that browser fills the window
  1554.    oXbp:drawingArea:resize := ;
  1555.        {|mp1,mp2,obj| obj:childList()[1]:setSize(mp2) }
  1556.  
  1557.    oXbp:show()
  1558.    oBrowse:show()
  1559.    oldWin = SetAppFocus(oBrowse)
  1560.  
  1561.    ChosenClient = 0
  1562.    
  1563.    DO WHILE nEvent <> xbeP_Close
  1564.       nEvent := AppEvent( @mp1, @mp2, @TheElement,0 )
  1565.       TheElement:handleEvent( nEvent, mp1, mp2 )
  1566.    ENDDO
  1567.    
  1568.    oXbp:hide()
  1569.    oBrowse:destroy()
  1570.    oXbp:destroy()
  1571.    SetAppFocus( oldWin )
  1572.  
  1573. RETURN ChosenClient
  1574.  
  1575. ******************************************************************
  1576. * Create GUI Browser with navigation codeblocks
  1577. ******************************************************************
  1578. FUNCTION GuiBrowseDB( oParent, aPos, aSize )
  1579.    LOCAL oBrowse
  1580.  
  1581.    oBrowse := XbpBrowse():new( oParent,, aPos, aSize,, .F. ):create()
  1582.  
  1583.    // navigation codeblocks for the browser
  1584.    oBrowse:skipBlock     := {|n| DbSkipper(n) }
  1585.    oBrowse:goTopBlock    := {| | DbGoTop()    }
  1586.    oBrowse:goBottomBlock := {| | DbGoBottom() }
  1587.    oBrowse:phyPosBlock   := {| | Recno()      }
  1588.    oBrowse:phyPosBlock   := {| | Recno()      }
  1589.    oBrowse:ItemSelected  := {| | ChosenClient:=Recno(), PostAppEvent (xbeP_Close) }
  1590.    // Code blocks for the vertical scrollbar.
  1591.    // Note: DbPosition() returns values in the range from 0 to 100.
  1592.    // We multiply this with 10 to increase the granularity of
  1593.    // the vertical scrollbar.
  1594.    oBrowse:posBlock      := {| | DbPosition()*10    }
  1595.    oBrowse:goPosBlock    := {|n| DbGoPosition(n/10) } 
  1596.    oBrowse:lastPosBlock  := {| | 1000               }
  1597.    oBrowse:firstPosBlock := {| | 0                  }
  1598.  
  1599. RETURN oBrowse
  1600.  
  1601.  
  1602. ******************************************************************
  1603. * Create std dialog window hidden
  1604. ******************************************************************
  1605. FUNCTION GuiStdDialog( cTitle, aPos, aSize )
  1606.    LOCAL oDlg
  1607.  
  1608.    DEFAULT cTitle TO "Standard Dialog Window"
  1609.  
  1610.    oDlg          := XbpDialog():new( AppDesktop(),,aPos, aSize,, .F. )
  1611.    oDlg:icon     := 1
  1612.    oDlg:taskList := .T.
  1613.    oDlg:title    := cTitle
  1614. *   oDlg:titlebar := .F.
  1615.    oDlg:drawingArea:ClipChildren := .T.
  1616.    oDlg:create()
  1617.    oDlg:drawingArea:setFontCompoundName( FONT_DEFPROP_SMALL )
  1618.  
  1619. RETURN oDlg
  1620. //
  1621. //------------------------------------------------------------
  1622. //
  1623. FUNCTION PRINT_CLI ()
  1624. //
  1625. LOCAL La:=SELECT(), M_choice, NRec
  1626.  
  1627. SELECT TEMPCLIN
  1628. NRec=RECNO()    // In TEMPCLIN
  1629.  
  1630. DO WHILE .T.
  1631.    //
  1632.    // DO allows multiple outputs of the same list
  1633.    //
  1634.    IF .NOT. Ini_Print (@M_choice)
  1635.       EXIT
  1636.    ELSE
  1637.       Print_Temp (M_choice)
  1638.    ENDIF
  1639. ENDDO
  1640.  
  1641. DCPRINT OFF
  1642. SET EXACT ON
  1643. SELECT TEMPCLIN
  1644. GO NRec
  1645. SELECT(La)
  1646. RETURN .T.
  1647. //
  1648. //-----------------------------------------------
  1649. //
  1650. FUNCTION Ini_Print ( m_choice )
  1651.  
  1652. LOCAL oBtn, oDlg,  oXbp, nEvent, mp1, mp2
  1653. LOCAL Ans:= .F.
  1654.  
  1655.  
  1656. oDlg := GuiStdDialog( "Impression", {50,200}, {200,150})
  1657. oDlg:setModalState(XBP_DISP_APPMODAL)
  1658. oDlg:show()
  1659. SetAppFocus(oDlg)
  1660. // 
  1661. // Create push buttons 
  1662. //
  1663.  
  1664. oBtn:= XbpPushButton():new( oDlg:drawingArea,,{25,70},{100,30} ) 
  1665. oBtn:caption := "Sommaire" 
  1666. oBtn:tabStop := .T. 
  1667. oBtn:activate := {|| Ini_Print_But(@m_choice, "S", @Ans), PostAppEvent( xbeP_Close )  }
  1668. oBtn:create()
  1669.  
  1670. oBtn:= XbpPushButton():new( oDlg:drawingArea,, {25,40},{100,30}  ) 
  1671. oBtn:caption := "Détail" 
  1672. oBtn:tabStop := .T. 
  1673. oBtn:activate := {|| Ini_Print_But(@m_choice, "D", @Ans), Ans = "Hello", PostAppEvent( xbeP_Close ) }
  1674. oBtn:create()
  1675.  
  1676. oBtn:= XbpPushButton():new( oDlg:drawingArea,, {25,10},{100,30}  ) 
  1677. oBtn:caption := "Cancel" 
  1678. oBtn:cancel  := .T. 
  1679. oBtn:tabStop := .T. 
  1680. oBtn:activate := {|| Ans=.F., PostAppEvent( xbeP_Close ) }
  1681. oBtn:create()
  1682.  
  1683. nEvent := xbe_None
  1684. DO WHILE nEvent <> xbeP_Close
  1685.    nEvent := AppEvent( @mp1, @mp2, @oXbp )
  1686.    oXbp:handleEvent( nEvent, mp1, mp2 )
  1687. ENDDO
  1688. oDlg:hide()
  1689. oDlg:destroy()
  1690.  
  1691. RETURN Ans
  1692. //
  1693. FUNCTION Ini_Print_But (choice,valeur,Reponse)
  1694. choice=valeur
  1695. reponse=.T.
  1696. RETURN .T.
  1697. //
  1698. //-----------------------------------------------
  1699. //
  1700. FUNCTION Print_Temp (R_Type)
  1701. LOCAL Mb,La, P_Pos, P_Mem :="<><><>"
  1702. PRIVATE oPrinter
  1703. La=SELECT()
  1704.  
  1705. Mb=""
  1706.  
  1707. SELECT TEMPCLIN
  1708. GO TOP
  1709. CLEAR
  1710. IF R_Type = "S"
  1711.    //
  1712.    // Print summary report
  1713.    //
  1714.    INDEX ON CLIENT->CLIPROFESS TO TEMP
  1715.  
  1716.    DCPRINT ON TO oPrinter FONT "8.Lucida Console" PREVIEW 
  1717.    
  1718.    DCPRINT ?"CLIENT"+SPACE(72)+"TELEPHONE"
  1719.    DO WHILE .NOT. EOF()
  1720.       SELECT CLIENT
  1721.       REC_LOCK()
  1722.       REC_LOCK()        //Ha Ha !
  1723.       UNSCRAM_CLI (SEED)
  1724.       IF CLIPROFESS <> P_Mem
  1725.          IF DC_PRINTERROW() > 48
  1726.             DCPRINT EJECT
  1727.          ENDIF
  1728.          DCPRINT ?
  1729.          DCPRINT ?
  1730.          DCPRINT ? "ACTIVITE " + CLIPROFESS
  1731.          DCPRINT ? "-------------"
  1732.          P_Mem = CLIPROFESS
  1733.       ENDIF
  1734.       DCPRINT ? CLIREF+" "+SUBSTR(CLINOM,1,28)+" "+CLICP+" "+CLIVILLE+" "+" "+CLIPHONE+" "+CLIPHONED
  1735.       SCRAM_CLI (SEED)
  1736.       UNLOCK
  1737.       IF DC_PRINTERROW() > 55
  1738.          DCPRINT EJECT
  1739.       ENDIF
  1740.       SELECT TEMPCLIN
  1741.       SKIP
  1742.    ENDDO
  1743.    EJECT
  1744.  
  1745.    DCPRINT OFF
  1746.    SET INDEX TO
  1747.    ERASE TEMP.NTX
  1748. ELSE
  1749.    //
  1750.    // Print detail report
  1751.  
  1752.    DCPRINT ON TO oPrinter FONT "8.Lucida Console" PREVIEW
  1753.    P_Pos = 2
  1754.  
  1755.    DO WHILE .NOT. EOF()
  1756.       DET_OUT(P_Pos)           // Print the report
  1757.  
  1758.       IF DC_PRINTERROW() < 30
  1759.          P_Pos = 33
  1760.          @ P_Pos -2,1 DCPRINT SAY REPLICATE("-",78)
  1761.       ELSE
  1762.          DCPRINT EJECT
  1763.          P_Pos = 2
  1764.       ENDIF
  1765.       //
  1766.       // Allow the User to kill it!
  1767.       //
  1768.       IF INKEY() = K_ESC .OR. LASTKEY() = K_ESC
  1769.         EXIT
  1770.       ENDIF
  1771.       SKIP
  1772.  
  1773.    ENDDO
  1774.  
  1775.    DCPRINT OFF
  1776. ENDIF
  1777. SELECT(La)
  1778.  
  1779.  
  1780. RETURN .T.
  1781. //
  1782. //-----------------------------------------------
  1783. //
  1784. FUNCTION Det_Out(Lin, Scram)
  1785. LOCAL ML:=0, L_CNT, MPL, La, V_String
  1786. DEFAULT Scram to .T.
  1787.  
  1788. La:=SELECT()
  1789. SELECT CLIENT
  1790. IF SCRAM
  1791.    REC_LOCK()       // Need lock to unscramble
  1792.    REC_LOCK()
  1793.    UNSCRAM_CLI(SEED)
  1794. ENDIF
  1795. @  Lin,    4  DCPRINT SAY  CLIREF
  1796. @  Lin,   15  DCPRINT SAY  CLINOM
  1797. @  Lin,   46  DCPRINT SAY  CLIABV
  1798. @  Lin,   53  DCPRINT SAY "Contact"
  1799. @  Lin,   61  DCPRINT SAY CLICONTACT
  1800. @  Lin+2,  4  DCPRINT SAY  CLIRUE
  1801. @  Lin+2, 57  DCPRINT SAY "BANQUE"
  1802. @  Lin+3,  4  DCPRINT SAY  CLIADS
  1803. @  Lin+3, 51  DCPRINT SAY  CLIBANK
  1804. @  Lin+4,  4  DCPRINT SAY  CLICP
  1805. @  Lin+4, 11  DCPRINT SAY  CLIVILLE
  1806. @  Lin+4, 51  DCPRINT SAY  CLIBCODE
  1807. @  Lin+4, 57  DCPRINT SAY  CLIBCGUI
  1808. @  Lin+4, 63  DCPRINT SAY  CLIBNCPT
  1809. @  Lin+4, 75  DCPRINT SAY  CLIBRIB
  1810.  
  1811. @  Lin+6 ,  4  DCPRINT SAY "Tél BUR  : " + CLIPHONE
  1812. @  Lin+6 , 40  DCPRINT SAY "Dom   : "  + CLIPHONED
  1813. @  Lin+7,   4  DCPRINT SAY "   Voit  : " + CLIPHONEV
  1814. @  Lin+7,  40  DCPRINT SAY "Fax   : " + CLIFAX
  1815.  
  1816. @  Lin+8,   4  DCPRINT SAY "Activité : " + CLIPROFESS
  1817. @  Lin+8,  40  DCPRINT SAY "Siret : "  + CLISIRET
  1818.  
  1819. @  Lin+9 ,  4   DCPRINT SAY "Dern. Cde:"
  1820. @  Lin+9 , 15  DCPRINT SAY  DCANNEE
  1821. @  Lin+9 , 24  DCPRINT SAY "TAILLE : " + CLITAILLE
  1822. @  Lin+9 , 41  DCPRINT SAY "Date de Création (MMAA):"
  1823. @  Lin+9 , 66  DCPRINT SAY DATE_CRE PICTURE '9999'
  1824.  
  1825. Lin=Lin+11
  1826. IF .NOT. EMPTY(COMMENTAIR)
  1827.    @  Lin,  4  DCPRINT SAY "COMMENTAIRE"
  1828.    L_CNT=MLCOUNT(COMMENTAIR, 62, 4, .T.)
  1829.    FOR ML=1 TO L_CNT
  1830.       IF DC_PRINTERROW() > 60
  1831.          DCPRINT EJECT
  1832.       ENDIF   
  1833.       MPL=MEMOLINE(COMMENTAIR,62,ML,4,.T.)
  1834.       @ ML+Lin,4 DCPRINT SAY MPL
  1835.    NEXT
  1836. ENDIF
  1837.  
  1838. Lin=Lin+ML+2
  1839. @ Lin,  4 DCPRINT SAY "DERNIERE VISITE : "
  1840. @ Lin, 22 DCPRINT SAY  CLIENT->DERNVISIT
  1841. @ Lin, 35 DCPRINT SAY "ACTION AVANT LE : "
  1842. @ Lin, 53 DCPRINT SAY CLIENT->RELANCE
  1843.  
  1844. V_String = LAST_VISIT(0,0,.T.)
  1845. IF .NOT. EMPTY(V_String)
  1846.    L_CNT=MLCOUNT(V_String, 62, 4, .T.)
  1847.    FOR ML=1 TO L_CNT
  1848.       IF DC_PRINTERROW() > 60
  1849.          DCPRINT EJECT
  1850.       ENDIF   
  1851.       MPL=MEMOLINE(V_String, 62, ML, 4, .T.)
  1852.       @ ML+Lin,4 DCPRINT SAY MPL
  1853.    NEXT
  1854. ENDIF
  1855.  
  1856. IF SCRAM
  1857.    SCRAM_CLI(SEED)
  1858.    UNLOCK
  1859. ENDIF
  1860.  
  1861. SELECT(La)
  1862. RETURN .T.
  1863.  
  1864. //
  1865. //----------------------------------------------------------------
  1866. //
  1867. FUNCTION COMC (BONTYPE)   //BONTYPE set in menu ="1" for normal fixed price
  1868.  
  1869. * Auteur...: R M ALCOCK
  1870. * Date.....: 6/3/95
  1871. * Copyright: (c) 1992, R M ALCOCK, Tous droits réservés
  1872. * Notes....: PROGRAMME DE ENREGISTREMENT COMMANDE
  1873. *          : called by COMMENU (MAINMENU)
  1874. *          : MEFRAN MEFRAN
  1875. *          : no PORT in the header
  1876. *          : includes risque, New_Tarif starred out
  1877. *          ;
  1878. DEFAULT BONTYPE TO "1"
  1879. SAVE ALL LIKE BONTYPE TO C:BT
  1880. *
  1881. DO WHILE .T.
  1882.    RESTORE FROM C:BT ADDITIVE     // Clears Local parameters, restores BONTYPE
  1883.    CLEAR
  1884.    MT = CONAME+" - SAISIE COMMANDE"
  1885.    @ 2,40-LEN(MT)/2 SAY MT
  1886.    @ 1,40-2-LEN(MT)/2 TO 3,40+2+LEN(MT)/2 DOUBLE
  1887.    IF .NOT. R_CLI(.T.)
  1888.       RETURN .T.
  1889.    ENDIF
  1890.    CLEAR
  1891.    @ 2,40-LEN(MT)/2 SAY MT
  1892.    @ 1,40-2-LEN(MT)/2 TO 3,40+2+LEN(MT)/2 DOUBLE
  1893.    SELECT CLIENT
  1894.    @ 4,2 SAY CLINOM+" "+CODEPOSTE+" "+VILLE
  1895.    *
  1896.    DO S_COMM WITH BONTYPE
  1897. ENDDO
  1898. RETURN .T.
  1899. *******
  1900.  
  1901. FUNCTION S_COMM (BONTYPE)
  1902. LOCAL t,l,b,r,m_tva:="O"
  1903. *
  1904. *Client is selected and databases open.
  1905. *
  1906. * All saisie comes in here so check risque
  1907. IF CLIENT->CLIRISQUE ="E"
  1908.    ALARM("RISQUE CODE E - COMPTE BLOQUE")
  1909.    RETURN .T.
  1910. ENDIF
  1911. *
  1912. *New_Tarif:=CONFIRM (21,4,"N","NOUVEAUX PRIX")
  1913. New_Tarif:=.F.
  1914. //
  1915. *
  1916. NET_USE (S_COM, "COM",    .F., 30, "COM,COMCL", "BON")
  1917. NET_USE (S_FACTA, "FACTA",  .F., 30, "FACTR", "")
  1918.  
  1919. t=0
  1920. l=0
  1921. b=23
  1922. r=79
  1923. zbuff=" "
  1924. do win with t,l,b,r,zbuff,"SAISIE COMMANDE",""
  1925. //
  1926. SELECT BON
  1927. *
  1928. DO WHILE .T.
  1929.    @ t+1,l+1 CLEAR TO b-1,r-1
  1930.    MCOMM=SPACE(5)
  1931.    @ 2,4 SAY "COMMANDE : " GET MComm ;
  1932.               PICTURE REPLICATE('9',LEN(MComm))
  1933.    READ
  1934.    IF EMPTY(MCOMM)
  1935.       RETURN .T.
  1936.    ENDIF
  1937.    IF X_REF("C"+Mcomm,"BON")
  1938.       ALARM ("COMMANDE EXISTE DEJA")
  1939.       LOOP
  1940.    ENDIF
  1941.    IF .NOT. CONFIRM (21,,"O","CONFIRMATION SAISIE : ")
  1942.       RETURN .T.
  1943.    ENDIF
  1944.    EXIT
  1945. ENDDO
  1946. ADD_REC(0)
  1947. REPLACE COMMANDE WITH "C"+MComm, EXPORT WITH 1, ;
  1948.         D_COMM WITH DATE(), REFCLI WITH CLIENT->CLIREF,;
  1949.         C_STATUS WITH "00", REGION WITH M_Reg
  1950. @ 2,30 SAY CLIENT->CLINOM
  1951. DO WHILE .T.
  1952.    @ 3,2 CLEAR TO 20,78
  1953.    @ 3,4 SAY "Remise EXCEPTIONNELLE (%):" GET REM_SUP RANGE 0,25
  1954.    @ 4,4 SAY "TVA (O/N)                :" GET M_TVA PICTURE '@!';
  1955.                                                     VALID M_TVA $ "ON"
  1956.    @ 6,4 SAY "ATTENTION - TVA et Remise EXCEPTIONNELLE ne peuvent pas être modifiées"
  1957.    READ
  1958.    IF REM_SUP<>0.AND..NOT.CONFIRM(10,,"N","Confirmation REMISE EXCEPTIONNELLE")
  1959.       LOOP
  1960.    ENDIF
  1961.    IF M_TVA='N'.AND..NOT.CONFIRM(10,,"N","Confirmation FACTURATION HORS TAXE")
  1962.       LOOP
  1963.    ENDIF
  1964.    EXIT
  1965. ENDDO
  1966. SELECT BON
  1967. REPLACE COMMENT WITH "TEL:"+CLIENT->CLIPHONE, EXPORT WITH IIF(M_TVA="O",1,0)
  1968. *
  1969. SELECT FACTA
  1970. ADD_REC(0)
  1971. REPLACE FACTURE WITH BON->COMMANDE,LIGNE WITH "99",ARTICLE WITH "+",;
  1972.        TYPE WITH BONTYPE
  1973. UNLOCK
  1974.  
  1975. DO LINESM
  1976.  
  1977. CLEAR
  1978.  
  1979. DO COMM_OUT WITH .T.,.F.
  1980.  
  1981. SELECT BON
  1982.  
  1983. DO RESET_SOLDE WITH "+"
  1984.  
  1985. SELECT BON
  1986. COMMIT
  1987. USE
  1988. SELECT FACTA
  1989. USE
  1990. RETURN .T.
  1991. *
  1992. ************
  1993. //
  1994. //----------------------------------------------------------------
  1995. //
  1996. * Programme: COMMPROC.PRG
  1997. * Auteur...: R M ALCOCK
  1998. * Date.....: 13/01/94
  1999. * Copyright: (c) 1992, R M ALCOCK, Tous droits réservés
  2000. * Notes....: PROCEDURES FOR COMMANDE SAISIE/MODIF
  2001. *          : !!!!!!!!!  line 147 *ed out for test (okflag always .T.)
  2002. *          : PRIXREEL now QUANTITE*PRIXREEL
  2003. *
  2004. *
  2005. FUNCTION ENTETE
  2006. //
  2007. //  SOLDEE and LIMITT set up in COMC
  2008. //
  2009. LOCAL Re
  2010. SELECT BON
  2011.  
  2012. Re=1-BON->REM_SUP/100
  2013.  
  2014. @ 1,0 SAY REFCLI
  2015. @ 1,12 SAY CLIENT->CLINOM
  2016. @ 1,43 SAY IIF (AVOIR,"   AVOIR REF","COMMANDE REF ")
  2017. @ 1,57 SAY COMMANDE
  2018. @ 2,0 SAY "HT : "
  2019. @ 2,5 SAY TOTHT*Re PICTURE '999999.99'
  2020. @ 2,16 SAY "TVA : "
  2021. @ 2,22 SAY TVATOT*Re PICTURE '999999.99'
  2022. IF .NOT. AVOIR
  2023.    @ 2,34 SAY "SOLDE :"
  2024.    @ 2,42 SAY (CLISOLDEE+TOTHT*Re) PICTURE '9999999.99'
  2025.    @ 2,54 SAY "LIMITE :"
  2026.    @ 2,63 SAY ENCOURSMAX PICTURE '999999999.99'
  2027.    IF CLISOLDEE+(TOTHT*Re) > ENCOURSMAX
  2028.      ?CHR(7)
  2029.    ENDIF
  2030. ENDIF
  2031. @ 3,0 SAY REPLICATE("-",75)
  2032. @ 4,0 SAY "ART   LIBELLE                      *  QTE.   PRIX U REM. R PRIX NET     TOTAL HT"
  2033.  
  2034. RETURN .T.
  2035. *
  2036. *****
  2037. **************************
  2038. *
  2039. FUNCTION ECROUT
  2040. PRIVATE I
  2041. IF LN < 18 .AND. .NOT. FORCE
  2042.    RETURN .T.
  2043. ENDIF
  2044. La=SELECT()
  2045. SELECT FACTA
  2046. MF=FACTURE
  2047. @ 5,0 CLEAR
  2048. LN = 0
  2049. IF NSKIP + NLIGNE >=0
  2050.    SKIP NSKIP
  2051. ELSE
  2052.    SKIP -NLIGNE
  2053. ENDIF
  2054. DO WHILE .T.
  2055.    DO LINEOUT
  2056.    SKIP
  2057.    LN=LN+1
  2058.    IF LN >= 5 .OR. EOF() .OR. FACTURE <> MF
  2059.       EXIT
  2060.    ENDIF
  2061. ENDDO
  2062. IF FORCE
  2063.    LN=LN-1
  2064.    SKIP-1
  2065. ENDIF
  2066. SELECT (La)
  2067. RETURN .T.
  2068. *
  2069. ******************************
  2070. *
  2071. FUNCTION LINEOUT
  2072. *
  2073. @ 5+LN,2 SAY ARTICLE
  2074. @ 5+LN,9 SAY LIB PICTURE REPLICATE("X",23)
  2075. I=SUBSTR(ARTICLE,1,1)
  2076. IF I<>"*" .AND. I<>"+" .AND. I<>"-"
  2077.    @ 5+LN,33 SAY QUANTITE
  2078.    @ 5+LN,39 SAY PU
  2079.    @ 5+LN,49 SAY REM_LINE
  2080.    @ 5+LN,54 SAY IIF(REPORT=98,"N","O")
  2081.    @ 5+LN,57 SAY ROUND(PRIXREEL/QUANTITE,2) PICTURE '999999.99'
  2082.    @ 5+LN,69 SAY PRIXREEL PICTURE '999999.99'
  2083.    WAIT
  2084. ENDIF
  2085. RETURN .T.
  2086. *******************************
  2087. *
  2088. FUNCTION LIGNEIN
  2089. * this is only used by AVOC
  2090. *
  2091. * LN = NUMERO LIGNE COURANTE
  2092. * SAISIE LIGNE ARTICLE :
  2093. *
  2094. La=SELECT()
  2095. SELECT FACTA
  2096. Fa=SELECT()
  2097. *CTYPE IS NOT "C" FOR THE FIRST ADDITIONAL LINE ON MODIFICATION
  2098. IF CTYPE = "C"
  2099.    ADD_REC(0)
  2100.  ELSE
  2101.    CTYPE = "C"
  2102. ENDIF
  2103. REC_LOCK(0)
  2104. MART=R_ART (5+LN,0)
  2105. REPLACE FACTURE WITH BON->COMMANDE, TYPE WITH BONTYPE,;
  2106.         ARTICLE WITH MART ,REPORT WITH 60
  2107. DO R_LINE
  2108. SELECT(La)
  2109. RETURN .T.
  2110. *******************************
  2111. *
  2112. FUNCTION R_LINE
  2113. PRIVATE  M_Q, M_R, MTXT, M_RPX
  2114. *
  2115. * Used by both LIGNEIN and LIGNEMOD
  2116. *
  2117. SET ESCAPE OFF
  2118. DO WHILE .T.
  2119.    *LOOP ALLOWS ARTICLE REFERENCE TO BE CHANGED
  2120.    SELECT (Fa)
  2121.    IF SUBSTR(ARTICLE,1,1)="+"
  2122.       REPLACE LIGNE WITH "99"
  2123.       ENDIT = .T.
  2124.       EXIT
  2125.    ENDIF
  2126.    REPLACE LIGNE WITH STR(NLIGNE+1,2)
  2127.    IF ARTICLE = "*"
  2128.       @ 5+LN,2 SAY ARTICLE
  2129.       @ 5+LN,9 GET LIB PICTURE "@S23"
  2130.       READ
  2131.       EXIT
  2132.    ENDIF
  2133.    *
  2134.    IF ARTICLE="-"
  2135.       EXIT
  2136.    ENDIF
  2137.    *
  2138.    *ARTICLE=STFAM+STREF OR = CODE_DIVERS
  2139.    AREF=ARTICLE
  2140.    IF ARTICLE <> CODE_DIVERS
  2141.       *
  2142.       *REAL ARTICLE REFERENCE
  2143.       SELECT STOCK
  2144.       SEEK AREF
  2145.       OKFLAG=.T.
  2146.       IF FOUND()
  2147.         *THE ARTICLE EXISTS IN THE STOCK FILE
  2148.          MPU=IIF(New_Tarif, STPRIXVNEW, STPRIXV)
  2149.  
  2150.          PPROMO = GET_PPROMO()     // returns prix promo (0 if no promotion)
  2151.          IF PPROMO > 0
  2152.             MPU=PPROMO
  2153.             ALARM("PRIX PROMOTION" )
  2154.          ENDIF
  2155.          OKFLAG=.T.
  2156.       ELSE
  2157.          * NON REFERENCED ARTICLE
  2158.          OKFLAG=.F.
  2159.       ENDIF
  2160.       SELECT (Fa)
  2161.       IF OKFLAG
  2162.           REPLACE LIB WITH STOCK->STLIB,;
  2163.             PU WITH MPU,LINETVA WITH STOCK->STTVA,;
  2164.             REM_LINE WITH "00",;
  2165.             FAM_PROD WITH STOCK->STFAM_PROD,REPORT WITH 0
  2166.             //
  2167.           ARTPDS=STOCK->POIDS
  2168.        ELSE
  2169.           AREF = "ERROR"
  2170.           REPLACE ARTICLE WITH ' ',LINETVA WITH 1,REM_LINE WITH "00"
  2171.           ARTPDS=0
  2172.        ENDIF
  2173.    ELSE
  2174.       * ARTICLE IS CODE_DIVERS
  2175.       ARTPDS=0
  2176.       REPLACE LINETVA WITH 1 ,REM_LINE WITH "00"
  2177.    ENDIF
  2178.    *APPLIES TO ALL ARTICLES IN THE CATALOGUE OR NOT
  2179.  
  2180.    DO LINEOUT
  2181.  
  2182.    REPLACE ARTICLE WITH R_ART(5+LN,2,ARTICLE)
  2183.  
  2184.    IF ARTICLE = AREF .AND. AREF <> "ERROR"
  2185.       @ 5+LN,09 GET LIB PICTURE "@S23"
  2186.       @ 5+LN,33 GET QUANTITE VALID QUANTITE > 0 .AND. UPDPRXREEL()
  2187.       @ 5+LN,39 GET PU VALID UPDPRXREEL()
  2188.       @ 5+LN,49 GET REM_LINE PICTURE '99' VALID VAL(REM_LINE) <= MAXREMLN;
  2189.                                                 .AND. UPDPRXREEL()
  2190.       IF .NOT. AVOIR
  2191.          // REPORT used for articles not to be delivered
  2192.          M_RPX = IIF(REPORT=98,"N","O")
  2193.          @ 5+LN, 54 GET M_RPX PICTURE '@!' VALID M_RPX $ "ON"
  2194.          READ
  2195.       ENDIF
  2196.       READ
  2197.       REPLACE REPORT WITH IIF(M_RPX="N",98,0)
  2198.       // you must do this every time
  2199.       UPDPRXREEL()
  2200.       // displays it as well
  2201.  
  2202.       IF BON->EXPORT = 0
  2203.          VALUETVA = 0
  2204.       ELSE
  2205.          IF LINETVA=2
  2206.             VALUETVA = TVARED
  2207.          ELSE
  2208.             VALUETVA = TVARATE
  2209.          ENDIF
  2210.       ENDIF
  2211.       IF .NOT. AVOIR
  2212.          IF ARTICLE = CODE_DIVERS
  2213.             PREFACT = .T.
  2214.          ELSE
  2215.             M_Q=QUANTITE
  2216.             M_R=ARTICLE
  2217.  
  2218.      *       DO CHK_STOK WITH M_R , M_Q
  2219.  
  2220.             * here only reset STPORT if operating on FACTA (ie saisie)
  2221.             IF ALIAS()="FACTA"
  2222.                PREFACT = .T.
  2223.                DO SETPF WITH STOCK->REF,M_Q,.T.,.F.  // incl composes
  2224.                                                            // only STPORT
  2225.             ENDIF
  2226.          ENDIF
  2227.       ENDIF
  2228.       SELECT STOCK
  2229.       UNLOCK
  2230.       SELECT (Fa)
  2231.       ARTTOT=PRIXREEL
  2232.          TOTHT=TOTHT+ARTTOT
  2233.          TOTPDS=TOTPDS+(QUANTITE*ARTPDS)
  2234.          TVATOT = TVATOT +(ARTTOT*VALUETVA)
  2235.       MMQTE=QUANTITE
  2236.       EXIT
  2237.    ENDIF
  2238. ENDDO
  2239. SELECT (Fa)
  2240. UNLOCK
  2241. SET ESCAPE ON
  2242. LN=LN+1
  2243. NLIGNE=NLIGNE+1
  2244. RETURN .T.
  2245. *
  2246. ************
  2247. *
  2248. FUNCTION UPDPRXREEL
  2249.  
  2250. REPLACE PRIXREEL WITH CALCPU(PU) *QUANTITE
  2251. @ 5+LN,57 SAY ROUND(PRIXREEL/QUANTITE,2) PICTURE '999999.99'
  2252. @ 5+LN,69 SAY PRIXREEL PICTURE '999999.99'
  2253.  
  2254. RETURN .T.
  2255. *
  2256. ******
  2257. *
  2258. FUNCTION CALCPU
  2259.  
  2260. PRIVATE mprix
  2261.  
  2262. MPRIX=PU*(100-VAL(REM_LINE))/100
  2263.  
  2264. RETURN MPRIX
  2265.  
  2266. *****************
  2267. *
  2268. FUNCTION GET_PPROMO()           // CLIENT  and STOCK positioned
  2269.                                 // works on today's date
  2270. LOCAL La,MCLREF,MSREF,PP
  2271. La=SELECT()
  2272. SELECT TARIFT
  2273. USE
  2274. NET_USE (S_PROMOS, "PROMOS", .F., 0, "PROMOS", "")
  2275. MCLREF=CLIENT->CLIREF
  2276. MSREF=STOCK->STCOMMREF
  2277. PP=0
  2278. SEEK MSREF+MCLREF
  2279. IF FOUND() .AND.  D_FIN>=SYSDATE() .AND. D_DEBUT<=DATE()
  2280.    PP=PRIXPROMO
  2281. ENDIF
  2282. NET_USE (S_TARIFT,"TARIFT", .F., 0, "TARIFT", "")         // restore TARIFT
  2283. SELECT (La)                     // restore entry conditions
  2284. RETURN PP                       // prom prix or 0
  2285. ******************
  2286. *
  2287. FUNCTION LIGNEMOD
  2288. LOCAL La, OLDART
  2289. *
  2290. * LN = NUMERO LIGNE COURANTE
  2291. * MODIFY LIGNE ARTICLE :
  2292. *
  2293. La=SELECT()
  2294. SELECT TEMPLN
  2295. Fa=SELECT()
  2296. OLDART=ARTICLE
  2297. OLDN = QUANTITE
  2298. OLDP = QUANTITE * PU
  2299. OLDREP = REPORT
  2300. BONTYPE=TYPE
  2301. LN=ROW()-5             // Offset of 4 in R_LINE
  2302. CTYPE="M"
  2303. REC_LOCK(0)
  2304. MC=COL()
  2305. *@ ROW(),0 CLEAR TO ROW(),79
  2306. MART=R_ART(5+LN,2)                  // Get new reference
  2307. IF MART=SPACE(LEN(STOCK->STCOMMREF)).OR.MART=OLDART
  2308.    UNLOCK
  2309.    RETURN .T.
  2310. ENDIF
  2311. REPLACE ARTICLE WITH MART
  2312. *
  2313. IF LIGNE="99"
  2314.    IF SUBSTR(ARTICLE,1,1)="-"
  2315.       REPLACE ARTICLE WITH "+"      // Can't delete last line!
  2316.    ELSE
  2317.       ** Replace last record i.e. add a new one
  2318.       RN=RECNO()
  2319.       ADD_REC(0)
  2320.       REPLACE FACTURE WITH BON->COMMANDE, TYPE WITH BONTYPE,;
  2321.               LIGNE WITH "99", ARTICLE WITH "+"
  2322.       GO RN
  2323.       REPLACE LIGNE WITH STR(RN,2)
  2324.    ENDIF
  2325. ENDIF
  2326. IF AT(SUBSTR(ARTICLE,1,1),"-+")=0   // Deleted Article or last line
  2327.    NLIGNE=VAL(LIGNE)-1              // Reset by R_LINE
  2328.    DO R_LINE
  2329. ENDIF
  2330. *
  2331. CHANGED = .T.
  2332. *
  2333. SELECT(La)
  2334. RETURN .T.
  2335. *
  2336. *******************************
  2337. *
  2338. FUNCTION C_TOTPDS
  2339. *
  2340. *  TOTPDS already zero from calling prog, and  first line  is selected
  2341.  
  2342. LOCAL La,mp
  2343. La=SELECT()
  2344.  
  2345. DO WHILE FACTURE=BON->COMMANDE .AND. .NOT. EOF()
  2346. *   IF REPORT =0
  2347.       AREF=ARTICLE
  2348.       SELECT STOCK
  2349.       SEEK AREF
  2350.       IF FOUND()
  2351.          mp=POIDS
  2352.       ELSE
  2353.          mp=0
  2354.       ENDIF
  2355.       SELECT (La)
  2356.       TOTPDS = TOTPDS+(QUANTITE*mp)
  2357. *   ENDIF
  2358.    SKIP
  2359. ENDDO
  2360. SELECT (La)
  2361. RETURN .T.
  2362. *
  2363. ****************
  2364. *
  2365. FUNCTION UPSTATS
  2366. LOCAL La
  2367. *
  2368. *RESETS TOT_POIDS  only in BON
  2369. *
  2370. La=SELECT()
  2371. SELECT BON
  2372. REPLACE TOT_POIDS WITH TOTPDS
  2373. SELECT (La)
  2374. RETURN .T.
  2375. *
  2376. **********************************
  2377. *
  2378. FUNCTION RESET_SOLDE (SIGN)                   // of client
  2379. // assumes client locked
  2380. LOCAL La, MAJVAL
  2381. La=SELECT()
  2382.  
  2383. SELECT BON
  2384. MAJVAL = MONTANT*(1-(REM_SUP/100))   // val now in BON
  2385. SELECT CLIENT
  2386. IF SIGN="+"
  2387.    REPLACE CLISOLDE WITH CLISOLDE + MAJVAL
  2388. ELSE
  2389.    REPLACE CLISOLDE WITH CLISOLDE - MAJVAL
  2390. ENDIF
  2391. SELECT (La)
  2392. RETURN .T.
  2393. *
  2394. ********************
  2395. *
  2396. FUNCTION COMM_OUT (MAJ,MODCLI)    // .T. if update allowed, .T. if you can
  2397.  
  2398. * this is called by saisie/modify commande and PFACT, and AVOC
  2399. * MONTANT is the TTC FROM SAISIE LINES
  2400. * need to know if refcli is changeable so second param exists
  2401. * for saisie MODCLI is .F. . You can't modify the client from the comm system
  2402. * MODCLI is only .T. for modify from mainmenu , or PFACT , or AVOC
  2403. * can't change the commande ref. or the montant
  2404.  
  2405. LOCAL ro, MREF,MREFCLI,TXT
  2406. SET ESCAPE OFF
  2407. IF PCOUNT()=0
  2408.    MAJ    =.F.
  2409.    MODCLI =.F.
  2410. ENDIF
  2411. IF PCOUNT()=1
  2412.    MODCLI =.F.
  2413. ENDIF
  2414. *
  2415. SELECT BON
  2416. IF .NOT. MAJ
  2417.    SET INTENSITY OFF
  2418. ELSE
  2419.    REC_LOCK()
  2420. ENDIF
  2421. *
  2422. *
  2423. IF SELECT("BON")=S_AVO
  2424.    TXT = "AVOIR"
  2425. ELSEIF SELECT("BON")=S_FACT
  2426.    TXT = "FACT."
  2427. ELSE
  2428.    TXT = "COMM."
  2429. ENDIF
  2430. @ 2,4 SAY TXT +"  : "+COMMANDE
  2431. IF MAJ .AND. MODCLI
  2432.    DO WHILE .T.
  2433.       MREFCLI=REFCLI
  2434.       @ 2,29 SAY "CLIENT :" GET MREFCLI
  2435.       READ
  2436.       IF VAL(MREFCLI)=VAL(REFCLI)
  2437.          EXIT
  2438.       ENDIF
  2439.       SELECT CLIENT
  2440.  
  2441.       MREF =MREFCLI
  2442.  
  2443.       SEEK MREF
  2444.       IF .NOT. FOUND()
  2445.          ALARM("CLIENT INCONNU")
  2446.          SELECT BON
  2447.          LOOP
  2448.       ELSE
  2449.          SELECT BON
  2450.          REPLACE REFCLI WITH MREF
  2451.          EXIT
  2452.       ENDIF
  2453.    ENDDO
  2454.    CLEAR GETS
  2455.    SET INTENSITY ON
  2456. ENDIF
  2457. // loop which follows is to check the integrity of the ttc and the echeances
  2458. //
  2459. DO WHILE .T.
  2460.   @ 2,29 SAY "CLIENT : " +REFCLI
  2461.   @ ROW(),COL()+2 SAY  CLIENT->CLINOM
  2462.   @ ROW()+1,25 SAY "CLIENT REF : " GET CLI_COMM
  2463.   ro=ROW()
  2464.   scolor=SETCOLOR()
  2465.   IF CLIENT->CLIRISQUE <>" "
  2466.      SETCOLOR("*"+scolor)
  2467.      @ 22,74 SAY "RISQ"
  2468.      IF MAJ
  2469.        ?CHR(7)
  2470.      ENDIF
  2471.   ELSE
  2472.      @ 22,74 SAY "    "
  2473.   ENDIF
  2474.   SETCOLOR(scolor)
  2475. *  @ ro+2,4 SAY " STATUS   : "+C_STATUS
  2476.   IF SELECT("BON")=S_AVO .OR. SELECT("BON")=S_FACT
  2477.      @ ro+2,4 SAY "DATE "+TXT+":" GET D_COMM  RANGE ;
  2478.       CTOD("01/" + STR(MONTH(SYSDATE()),2) +"/" + STR(YEAR(SYSDATE())-1900,2)),;
  2479.       SYSDATE()
  2480.   ELSE
  2481.      @ ro+2,4 SAY "DATE "+TXT+" :" GET D_COMM
  2482.   ENDIF
  2483.  
  2484.   @ ROW(),COL()+8 SAY "DATE DEPART   : " GET D_LIVR
  2485.   @ ROW()+1,4 SAY " TVA (O/N):  " + IIF(BON->EXPORT=0,"N","O")
  2486.   @ ROW(),COL()+4 SAY " % REMISE SUP :"
  2487.   @ ROW(),COL()+1 SAY REM_SUP
  2488. *  IF SELECT("BON")<>S_AVO
  2489. *    @ ROW(),COL()+10 SAY  "REGL. GROUPE   :" GET REGL_GRP PICTURE "@!" ;
  2490. *                                         VALID AT(REGL_GRP,"G ")>0
  2491. *  ENDIF
  2492.   @ ROW()+1,8 SAY "VRP   : " GET REGION VALID REGION<>SPACE(4)
  2493.   @ ROW(),COL()+2 SAY " MONTANT TTC :"
  2494.   @ ROW(),COL()+1 SAY STR(MONTANT*(1-REM_SUP/100),10,2)  PICTURE '9999999.99'
  2495.   @ ROW()+2,4 SAY "LIVRAISON :" GET LIVR_NOM
  2496.   @ ROW()+1,16 GET LIVR_RUE
  2497.   @ ROW()+1,16 GET LIVR_ADS
  2498.   @ ROW()+1,16 GET LIVR_CP
  2499.   @ ROW(),COL()+3 GET LIVR_VILLE
  2500.   IF SELECT("BON")=S_AVO
  2501.     IF MAJ
  2502.       READ
  2503.       UNLOCK
  2504.     ELSE
  2505.       CLEAR GETS
  2506.     ENDIF
  2507.     EXIT
  2508.   ENDIF
  2509.   // not for avoirs
  2510.   @ ROW()+2,4 SAY "Remarques :" GET COMMENT
  2511.   @ ROW()+1,4 SAY "Remarques :" GET COMMENT2
  2512.  
  2513.   @ ROW()+2, 4 SAY "ECHEANCES :"
  2514.  
  2515.   @ ROW()+1,4      GET MECH1
  2516.   @ ROW(),COL()+2  GET CP1   VALID IIF(MECH1=0, CP1=" ", CP1$"0235679")
  2517.   @ ROW(),COL()+2  GET DECH1 VALID (EMPTY(DECH1).AND. MECH1=0) .OR.;
  2518.                              ( DECH1>=D_COMM .AND. DECH1<D_COMM+120 )
  2519.  
  2520.   @ ROW(),COL()+3  GET MECH2
  2521.   @ ROW(),COL()+2  GET CP2   VALID IIF(MECH2=0, CP2=" ", CP2$"0235679")
  2522.   @ ROW(),COL()+2  GET DECH2 VALID (EMPTY(DECH2).AND. MECH2=0) .OR.;
  2523.                              ( DECH2>=D_COMM .AND. DECH2<D_COMM+120 )
  2524.  
  2525.   @ ROW(),COL()+3  GET MECH3
  2526.   @ ROW(),COL()+2  GET CP3   VALID IIF(MECH3=0, CP3=" ", CP3$"0235679")
  2527.   @ ROW(),COL()+2  GET DECH3 VALID (EMPTY(DECH3).AND. MECH3=0) .OR.;
  2528.                              ( DECH3>=D_COMM .AND. DECH3<D_COMM+120 )
  2529.  
  2530.   @ ROW()+1,4      GET MECH4
  2531.   @ ROW(),COL()+2  GET CP4   VALID IIF(MECH4=0, CP4=" ", CP4$"0235679")
  2532.   @ ROW(),COL()+2  GET DECH4 VALID (EMPTY(DECH4).AND. MECH4=0) .OR.;
  2533.                              ( DECH4>=D_COMM .AND. DECH4<D_COMM+120 )
  2534.  
  2535.   @ ROW(),COL()+3  GET MECH5
  2536.   @ ROW(),COL()+2  GET CP5   VALID IIF(MECH5=0, CP5=" ", CP5$"0235679")
  2537.   @ ROW(),COL()+2  GET DECH5 VALID (EMPTY(DECH5).AND. MECH5=0) .OR.;
  2538.                              ( DECH5>=D_COMM .AND. DECH5<D_COMM+120 )
  2539.  
  2540.   @ ROW(),COL()+3  GET MECH6
  2541.   @ ROW(),COL()+2  GET CP6   VALID IIF(MECH6=0, CP6=" ", CP6$"0235679")
  2542.   @ ROW(),COL()+2  GET DECH6 VALID (EMPTY(DECH6).AND. MECH6=0) .OR.;
  2543.                              ( DECH6>=D_COMM .AND. DECH6<D_COMM+120 )
  2544.  
  2545.   @ ROW()+1,4      GET MECH7
  2546.   @ ROW(),COL()+2  GET CP7   VALID IIF(MECH7=0, CP7=" ", CP7$"0235679")
  2547.   @ ROW(),COL()+2  GET DECH7 VALID (EMPTY(DECH7).AND. MECH7=0) .OR.;
  2548.                              ( DECH7>=D_COMM .AND. DECH7<D_COMM+120 )
  2549.  
  2550.   @ ROW(),COL()+3  GET MECH8
  2551.   @ ROW(),COL()+2  GET CP8   VALID IIF(MECH8=0, CP8=" ", CP8$"0235679")
  2552.   @ ROW(),COL()+2  GET DECH8 VALID (EMPTY(DECH8).AND. MECH8=0) .OR.;
  2553.                              ( DECH8>=D_COMM .AND. DECH8<D_COMM+120 )
  2554.  
  2555.   @ ROW(),COL()+3  GET MECH9
  2556.   @ ROW(),COL()+2  GET CP9   VALID IIF(MECH9=0, CP9=" ", CP9$"0235679")
  2557.   @ ROW(),COL()+2  GET DECH9 VALID (EMPTY(DECH9).AND. MECH9=0) .OR.;
  2558.                              ( DECH9>=D_COMM .AND. DECH9<D_COMM+120 )
  2559.  
  2560.   @ ROW()+1,4      GET MECH10
  2561.   @ ROW(),COL()+2  GET CP10   VALID IIF(MECH10=0, CP10=" ", CP10$"0235679")
  2562.   @ ROW(),COL()+2  GET DECH10 VALID (EMPTY(DECH10).AND. MECH10=0) .OR.;
  2563.                              ( DECH10>=D_COMM .AND. DECH10<D_COMM+120 )
  2564.  
  2565.   @ ROW(),COL()+3  GET MECH11
  2566.   @ ROW(),COL()+2  GET CP11   VALID IIF(MECH11=0, CP11=" ", CP11$"0235679")
  2567.   @ ROW(),COL()+2  GET DECH11 VALID (EMPTY(DECH11).AND. MECH11=0) .OR.;
  2568.                              ( DECH11>=D_COMM .AND. DECH11<D_COMM+120 )
  2569.  
  2570.   @ ROW(),COL()+3  GET MECH12
  2571.   @ ROW(),COL()+2  GET CP12   VALID IIF(MECH12=0, CP12=" ", CP12$"0235679")
  2572.   @ ROW(),COL()+2  GET DECH12 VALID (EMPTY(DECH12).AND. MECH12=0) .OR.;
  2573.                              ( DECH12>=D_COMM .AND. DECH12<D_COMM+120 )
  2574.  
  2575.   IF MAJ
  2576.      READ
  2577.      IF .NOT. CHK_TTC()
  2578.          LOOP
  2579.      ENDIF
  2580.      UNLOCK
  2581.      SELECT CLIENT
  2582.      REPLACE DCANNEE WITH BON->D_COMM,;
  2583.              CLISTATUS WITH "1"      // Force update to Florensac
  2584.      SELECT BON
  2585.      EXIT
  2586.   ELSE
  2587.      CLEAR GETS
  2588.      EXIT
  2589.   ENDIF
  2590. ENDDO
  2591. SET INTENSITY ON
  2592. SET ESCAPE ON
  2593. *
  2594. RETURN .T.
  2595. *
  2596. *************
  2597. FUNCTION CHK_TTC
  2598. LOCAL Totech,Mval
  2599. Totech=MECH1+MECH2+MECH3+MECH4+MECH5+MECH6+MECH7+MECH8+MECH9+MECH10+;
  2600.             MECH11+MECH12 
  2601. IF Totech=0 .AND. MONTANT=0
  2602.    RETURN .T.
  2603. ENDIF
  2604. Mval= ROUND(MONTANT*(1-REM_SUP/100),2)
  2605. IF ABS(Mval-Totech)>0.001
  2606.     @ 0,0 SAY " "
  2607.     ALARM("Total des echéances = " + STR(Totech,10,2)+" TTC = "+STR(Mval,10,2))
  2608.     // this is OK if reglement is grouped only
  2609.     IF REGL_GRP="G"
  2610.        RETURN .T.
  2611.     ELSE
  2612.        RETURN .F.
  2613.     ENDIF
  2614. ENDIF
  2615. RETURN .T.
  2616. *
  2617. //
  2618. //-----------------------------------------------------------------
  2619. //
  2620. * Programme: LITPROC.PRG
  2621. * Auteur...: R M ALCOCK
  2622. * Date.....: 13 MAY
  2623. * Copyright: (c) 1992, R M ALCOCK, Tous droits réservés
  2624. * Notes....: PROCEDURES for LITIGE system
  2625. *
  2626. *
  2627. FUNCTION LIT_INIT
  2628. *
  2629. NET_USE (S_LITIGE, "LITIGE", .T., 30, "", "")
  2630. IF .NOT. FILE("LITIGE.NTX")
  2631.    INDEX ON CODE TO LITIGE
  2632. ENDIF
  2633. IF .NOT. FILE("LITDATE.NTX")
  2634.    INDEX ON A_DATE TO LITDATE
  2635. ENDIF
  2636. IF .NOT. FILE("LITCLI.NTX")
  2637.    INDEX ON CLIENT TO LITCLI
  2638. ENDIF
  2639. NET_USE (S_LITIGE, "LITIGE", .F., 30, "", "")
  2640. FIL_LOCK(0)
  2641. SET INDEX TO LITIGE,LITDATE,LITCLI
  2642. UNLOCK
  2643. NET_USE (S_LITREG, "LITREG", .F., 0, "", "")
  2644. NET_USE (S_LITCOD, "LITCOD", .F., 0, "", "")
  2645. SELECT LITIGE
  2646. RETURN .T.
  2647. *
  2648. **************************************
  2649. *
  2650. FUNCTION CRELIT
  2651. *
  2652. LOCAL HM:="C O N T A C T  - CREATION", MCODE, M_Type
  2653. SELECT LITCOD
  2654. M_Type = RMAMENU(HM,MRCODE,LCD)      // Get Type of record
  2655. DO HLOFF WITH LCD
  2656. CLEAR
  2657. M_Type = ALLTRIM(LIBELLE)
  2658. //
  2659. IF M_Type<>""
  2660.  
  2661.    NET_USE (S_ATTACH, "ATTACH", .T., 0, "", "")
  2662.    MCODE = "95"+PAD(STR(VISITNUM,4) , 4)
  2663.    REPLACE VISITNUM WITH IIF(VISITNUM<9999, VISITNUM+1, 1)
  2664.    USE
  2665.  
  2666.    SELECT LITIGE
  2667.    ADD_REC(0)
  2668.    REPLACE REGION WITH M_Reg, D_ECR WITH DATE(), CODE WITH MCODE,;
  2669.                     RESP WITH M_Resp, CLIENT WITH MCLI, TYPE WITH M_Type
  2670.    DO LITFMT WITH 1           // Read date, Label, Memo
  2671. *   READ
  2672.    //
  2673.    // Create an EVENT record and attach it to the client
  2674.    //
  2675.    SELECT EVENT
  2676.    ADD_REC (0)
  2677.    STORE_EVENT()
  2678.    SELECT CLIENT
  2679.    REPLACE DERNVISIT WITH LITIGE->D_ECR,;
  2680.            RELANCE   WITH LITIGE->A_DATE,;
  2681.            CLISTATUS WITH "1"
  2682.    ALARM ("CONTACT ENREGISTRE")
  2683.  
  2684. ENDIF
  2685. SELECT LITIGE
  2686. USE
  2687. SELECT LITCOD
  2688. USE
  2689. SELECT LITREG
  2690. USE
  2691.  
  2692. RETURN .T.
  2693. *
  2694. ******
  2695. FUNCTION LECRAN
  2696. *
  2697. * Used by LITFMT to display a record
  2698.  
  2699. *
  2700. DO HLON
  2701. @  2, 2  SAY  "DATE   : "
  2702. @  2,12  SAY  D_ECR
  2703. @  2, 40  SAY "ACTION AVANT LE :"
  2704. DO HLOFF WITH LCD
  2705. @  2, 58  SAY  LITIGE->A_DATE
  2706. @  4, 2  SAY  "CLIENT :"
  2707. @  4, 11  SAY  LITIGE->CLIENT
  2708. IF .NOT. EMPTY(LITIGE->CLIENT)
  2709.   @  4, 23  SAY CLIENT->CLIABV+" "+CLIENT->CLINOM
  2710. ENDIF
  2711. @  6,  2  SAY "VRP    :"
  2712. @  6, 11  SAY  LITIGE->REGION
  2713. @  6, 17  SAY "CODE :"
  2714. @  6, 24  SAY  LITIGE->CODE
  2715. @  6, 32  SAY "TYPE :"
  2716. @  6, 39  SAY  LITIGE->TYPE
  2717.  
  2718. IF LITIGE->TYPE $ "IMPAYEE,LITIGE"
  2719.    @  8, 2   SAY "FACTURE:"
  2720.    @  8, 11  SAY  LITIGE->FACTURE
  2721.    @  8, 22  SAY "MONTANT:"
  2722.    @  8, 31  SAY LITIGE->MONTANT
  2723. ENDIF
  2724. @ 11,  1  SAY "COMMENTAIRE :"
  2725. *
  2726. RETURN .T.
  2727. *
  2728. //
  2729. //------------------------------------------------------------------------
  2730. //
  2731. FUNCTION PRINT_L
  2732. *
  2733. @  2, 2  DCPRINT SAY  "DATE   : "
  2734. @  2,12  DCPRINT SAY  D_ECR
  2735. @  2,40  DCPRINT SAY "ACTION AVANT LE :"
  2736. @  2,58  DCPRINT SAY  LITIGE->A_DATE
  2737. @  4, 2  DCPRINT SAY  "CLIENT :"
  2738. @  4,11  DCPRINT SAY  LITIGE->CLIENT
  2739. IF .NOT. EMPTY(LITIGE->CLIENT)
  2740.   @  4, 23  DCPRINT SAY CLIENT->CLIABV+" "+CLIENT->CLINOM
  2741. ENDIF
  2742. @  6,  2  DCPRINT SAY "VRP    :"
  2743. @  6, 11  DCPRINT SAY  LITIGE->REGION
  2744. @  6, 17  DCPRINT SAY "CODE :"
  2745. @  6, 24  DCPRINT SAY  LITIGE->CODE
  2746. @  6, 32  DCPRINT SAY "TYPE :"
  2747. @  6, 39  DCPRINT SAY  LITIGE->TYPE
  2748.  
  2749. IF LITIGE->TYPE $ "IMPAYEE,LITIGE"
  2750.    @  8, 2   DCPRINT SAY "FACTURE:"
  2751.    @  8, 11  DCPRINT SAY  LITIGE->FACTURE
  2752.    @  8, 22  DCPRINT SAY "MONTANT:"
  2753.    @  8, 31  DCPRINT SAY LITIGE->MONTANT
  2754. ENDIF
  2755. @ 11,  1  DCPRINT SAY "COMMENTAIRE :"
  2756. *
  2757. RETURN .T.
  2758. *
  2759. //
  2760. //--------------------------------------------------------------------------------
  2761. //
  2762. FUNCTION LITFMT (CONTROL)
  2763. *
  2764. * Control = 1   Creation, don't read REGION, CODE, RESP
  2765. * Control = 2   Modif, all parameters except D_ECR and CODE can be changed
  2766. * Control = 3   Deletion, no read
  2767. *
  2768. LOCAL abuff
  2769. REC_LOCK(0)
  2770.  
  2771. IF Control=1
  2772.    // Create
  2773.    do win with 0,0,23,79,abuff, "CREATION "+ALLTRIM(EVENT->TYPE)
  2774. ENDIF
  2775.  
  2776. DO LECRAN                        // OUTPUT Screen Format
  2777. @ 12,  1  TO 12, 10
  2778. MEMOEDIT(LITIGE->COMMENTAIR,13,1,21,78,.F.,.F.,74)
  2779. IF CONTROL=3                     // CONTROL=3 No Gets
  2780.    RETURN .T.
  2781. ENDIF
  2782. @  2, 12  GET  LITIGE->D_ECR  RANGE DATE()-300, DATE()
  2783. @  2, 58  GET  LITIGE->A_DATE RANGE DATE(),DATE()+500
  2784. IF LITIGE->TYPE $ "IMPAYEE,LITIGE"
  2785.    @  8, 11  GET  LITIGE->FACTURE
  2786.    @  8, 31  GET  LITIGE->MONTANT
  2787. ENDIF
  2788. READ
  2789.  
  2790. IF LASTKEY()<>K_ESC
  2791.    // Operate on Memo field
  2792.    @ 11,18 CLEAR TO 21,78
  2793.    DO HLON
  2794.    @ 23,31 SAY "   F1 pour Aide   " //spaces to overwrite old message
  2795.    DO HLOFF WITH LCD
  2796.    ED_MEMO()         // FUNCTION used so that HELP can decode situation
  2797. ENDIF
  2798.  
  2799. IF UPDATED()
  2800.  
  2801.    IF LITIGE->D_ECR > CLIENT->DERNVISIT
  2802.       REPLACE CLIENT->DERNVISIT WITH LITIGE->D_ECR,;
  2803.               CLIENT->CLISTATUS WITH "1"
  2804.    ENDIF
  2805.    IF CLIENT->RELANCE > LITIGE->A_DATE
  2806.       REPLACE CLIENT->RELANCE   WITH LITIGE->A_DATE,;
  2807.               CLIENT->CLISTATUS WITH "1"
  2808.    ENDIF
  2809.  
  2810.    SELECT EVENT
  2811.    SEEK LITIGE->CODE
  2812.    IF FOUND()
  2813.       STORE_EVENT()
  2814.    ENDIF
  2815. ENDIF
  2816.  
  2817. UNLOCK
  2818. IF Control=1
  2819.    // Create
  2820.    do wout with 0,0,23,79,abuff
  2821. ENDIF
  2822.  
  2823. RETURN .T.
  2824. ***
  2825. FUNCTION LITCLI()
  2826. LOCAL La,R:=.T.
  2827. La=SELECT()
  2828. IF EMPTY(LITIGE->CLIENT)
  2829.    RETURN .T.
  2830. ENDIF
  2831. SELECT CLIENT
  2832. SEEK LITIGE->CLIENT
  2833. IF .NOT. FOUND()
  2834.   R= .F.
  2835. ELSE
  2836.   DO LECRAN
  2837. ENDIF
  2838. SELECT (La)
  2839. RETURN R
  2840. ****
  2841. //
  2842. //------------------------------
  2843. //
  2844. FUNCTION STORE_EVENT()
  2845. //
  2846. LOCAL M_Sel:=SELECT()
  2847. SELECT LITCOD
  2848. LOCATE FOR CODE = EVENT->TYPE
  2849. SELECT EVENT
  2850. REPLACE REFCLI WITH LITIGE->CLIENT,;
  2851.         D_CRE  WITH LITIGE->D_ECR,;
  2852.         TYPE   WITH LITIGE->TYPE,;
  2853.         BONREF WITH LITIGE->CODE
  2854. SELECT (M_Sel)
  2855. RETURN .T.
  2856. //
  2857. //------------------------------
  2858. //
  2859. FUNCTION ED_MEMO()
  2860. LOCAL bBlock
  2861. //
  2862. // Only exists so the HELP system will work !!!
  2863. //
  2864. bBlock = SetKey( K_F1, { || help_me ( ProcName(), ProcLine(), "COMMENTAIR" ) } )
  2865. REPLACE COMMENTAIR WITH MEMOEDIT(COMMENTAIR,13,1,21,78,.T.)
  2866. SetKey ( K_F1, bBlock)
  2867. RETURN .T.
  2868. //
  2869. //-----------------------------------------------------------
  2870. //
  2871.  
  2872. * Programme: COMMENT. PRG   (was proc T_COMMENT in MAIN)
  2873. * Auteur...: R M ALCOCK
  2874. * Date.....: 3/3/95
  2875. * Copyright: (c) 1995, R M ALCOCK, Tous droits réservés
  2876. * Notes....: Used by MAIN and MAINMENU
  2877. *
  2878. *
  2879. FUNCTION T_COMMENT (CONTROL)
  2880.  
  2881. LOCAL La,MA[4],MBUFF1:="",MBuff2:="",MCHOIX
  2882. LOCAL t:=17,l:=57,b:=22,r:=75             // Menu Position
  2883. LOCAL TL:=5, LM:=5, RM:=76, BM:=23        // Comment Screen
  2884. LOCAL oPrinter, bBlock
  2885.  
  2886. La=SELECT()
  2887. SELECT CLIENT
  2888. MA[1]="RETOUR   "
  2889. MA[2]="Modifier "
  2890. MA[3]="Imprimer "
  2891. MA[4]="Supprimer"
  2892. *
  2893. DO WIN WITH TL,LM,BM,RM,MBUFF2,"COMMENTAIRE",""   // Preserve outside screen
  2894.  
  2895. MEMOEDIT(COMMENTAIR,TL+1,LM+2,BM-1,RM-2,.F.,.F.)  // Display the memo
  2896. bBlock = SetKey( K_F1, { || help_me ( ProcName(), ProcLine(), "COMMENTAIR" ) } )
  2897. *
  2898. DO WHILE .T.
  2899.    DO WIN WITH t,l,b,r,MBUFF1,"COMMENTAIRE",""    // Preserve the memo
  2900.    IF CONTROL=1                          // Creation
  2901.       MCHOIX=2                           // Force an edit
  2902.       CONTROL=0                          // Normal next time
  2903.    ELSE
  2904.       SET COLOR TO &MENUCLR
  2905.       MCHOIX=ACHOICE(t+1,l+2,b-1,r-1,MA)
  2906.       DO HLOFF WITH LCD                  // Get Colour back
  2907.    ENDIF
  2908.    DO WOUT WITH t,l,b,r,MBUFF1           // Get back memo without menu
  2909.    DO CASE
  2910.       CASE MCHOIX=0.OR.MCHOIX=1          // RETOUR
  2911.          SELECT(La)
  2912.          EXIT
  2913.       CASE MCHOIX=2                      // Modifier
  2914.          @ 23,34 SAY "F1 pour Aide"
  2915.          REPLACE COMMENTAIR WITH MEMOEDIT(COMMENTAIR,TL+1,LM+2,BM-1,RM-2,.T.)
  2916.          REPLACE CLISTATUS WITH "1"      // Force update to Florensac
  2917.  
  2918.       CASE MCHOIX=3                      // Imprimer
  2919.  
  2920.          DCPRINT ON TO oPrinter
  2921.  
  2922.          @ 2,4 DCPRINT SAY "COMMENTAIRE Client : " +CLIENT->CLIREF
  2923.          @ PROW(),PCOL()+2 DCPRINT SAY CLINOM
  2924.          L_CNT=MLCOUNT(COMMENTAIR, 62, 4, .T.)
  2925.          FOR ML=1 TO L_CNT
  2926.              MPL=MEMOLINE(COMMENTAIR,62,ML,4,.T.)
  2927.              @ ML+4,4 DCPRINT SAY MPL
  2928.          NEXT
  2929.          DCPRINT EJECT
  2930.          
  2931.          DCPRINT OFF
  2932.          
  2933.  
  2934.       CASE MCHOIX=4                      // Efface memo
  2935.          IF CONFIRM (21,3,"N","EFFACE COMMENTAIRE : ")
  2936.             REPLACE COMMENTAIR WITH ""
  2937.             REPLACE CLISTATUS WITH "1"   // Force update to Florensac
  2938.          ENDIF
  2939.          @ 21,3 CLEAR TO 21,79
  2940.       OTHERWISE
  2941.    ENDCASE
  2942. ENDDO
  2943. DO WOUT WITH TL,LM,BM,RM,MBUFF2
  2944. SetKey ( K_F1, bBlock)
  2945. SELECT (La)
  2946. RETURN .T.
  2947. //
  2948. //----------------------------------------------------------------
  2949. //
  2950. FUNCTION COMM
  2951. * Auteur...: R M ALCOCK
  2952. * Date.....: 6/3/95
  2953. * Copyright: (c) 1992, R M ALCOCK, Tous droits réservés
  2954. * Notes....: Modification Command (MEFRAN)
  2955. *                         ---
  2956. *
  2957. * First Choose the Commande
  2958. *
  2959. DO WHILE .T.
  2960.    CLEAR
  2961.    SELECT BON
  2962.    SET CURSOR ON
  2963.    MCOM=SPACE(LEN(COMMANDE))
  2964.    MT = CONAME+" - MODIFICATION COMMANDE"
  2965.    @ 2,40-LEN(MT)/2 SAY MT
  2966.    @ 1,40-2-LEN(MT)/2 TO 3,40+2+LEN(MT)/2 DOUBLE
  2967.  
  2968.    @ ROW()+6,14 SAY "Commande REFERENCE :";
  2969.                 GET MCOM
  2970.    READ
  2971.    IF MCOM=SPACE(LEN(COMMANDE))
  2972.       RETURN .T.
  2973.    ENDIF
  2974.    *
  2975.    *
  2976.    SET ORDER TO 1
  2977.    SEEK MCOM
  2978.    IF .NOT. FOUND()
  2979.       @ 12,14 SAY "COMMANDE N'EXISTE PAS - Tapez une touche"
  2980.       WAIT " "
  2981.       LOOP
  2982.    ENDIF
  2983.    * Commande Selected, do Modif.
  2984.    t=0
  2985.    l=0
  2986.    b=23
  2987.    r=79
  2988.    zbuff=" "
  2989.    REC_LOCK(0)
  2990.    * as in ZCC
  2991.    do win with t,l,b,r,zbuff,"COMMANDE"
  2992.    * client is not yet selected
  2993.    SELECT CLIENT
  2994.    SEEK BON->REFCLI
  2995.    SELECT BON
  2996.    DO COMM_OUT
  2997.    SET CURSOR OFF
  2998.    DO COMMMENU
  2999.    do wout with t,l,b,r,zbuff
  3000. ENDDO
  3001. RETURN .T.
  3002. *
  3003. ****************************************
  3004. *
  3005. FUNCTION COMMMENU (MODCLI)
  3006. *.......................................
  3007. *
  3008. LOCAL MA[4],MBUFF1,t,l,b,r,MCHOIX,MSEL,DEL:=.F.
  3009. MODCLI=IIF (PCOUNT()=0,.T.,.F.)
  3010.                    // If called from F2 in Commercial system PCOUNT
  3011.                    // can never be zero because it is automatically set
  3012.                    // to the name of the calling routine, therefore
  3013.                    // if not set, the call is from COMM
  3014. *
  3015. MCHOIX=1           // Selction Code in Menu
  3016. MSEL=SELECT()
  3017. SELECT BON
  3018. *
  3019. do keysoff
  3020. t=12
  3021. l=52
  3022. b=17
  3023. r=72
  3024. MBUFF1=""
  3025. MA[1]="RETOUR   "
  3026. MA[2]="Modifier En-tête"
  3027. MA[3]="         Lignes"
  3028. MA[4]="Supprimer"
  3029. DO WHILE .T.
  3030.    DO WIN WITH t,l,b,r,MBUFF1,"",""
  3031.    SET COLOR TO &MENUCLR
  3032.    //
  3033.    // Should test the status here to deal with blocked commandes - STATUS 40
  3034.    //
  3035.    MCHOIX=ACHOICE(t+1,l+2,b-1,r-1,MA)
  3036.    DO WOUT WITH t,l,b,r,MBUFF1
  3037.    DO HLOFF WITH LCD
  3038.    DO CASE
  3039.       CASE MCHOIX=0.OR.MCHOIX=1
  3040.          SELECT(MSEL)
  3041.          IF .NOT. MODCLI
  3042.             set key K_F2 to COMMMENU  // If MODCLI=.F. called from MAIN
  3043.          ENDIF
  3044.          RETURN .T.
  3045.       CASE MCHOIX=2
  3046.          SET CURSOR ON
  3047.          IF VAL(BON->C_STATUS)=40
  3048.            ALARM("COMMANDE BLOQUEE")
  3049.          ELSE
  3050.            IF VAL(BON->C_STATUS)>9
  3051.              ALARM("ATTENTION!! DEJA FACTUREE")
  3052.            ENDIF
  3053.          ENDIF
  3054.          DO COMM_OUT WITH .T.,MODCLI
  3055.          SET CURSOR OFF
  3056.       CASE MCHOIX=3
  3057.          SET CURSOR ON
  3058.          IF VAL(BON->C_STATUS)<>0
  3059.             ALARM("BON DEJA ENVOYEE A FLORENSAC")
  3060.          ENDIF
  3061. *         IF VAL(BON->C_STATUS)=10
  3062. *            ALARM("ATTENTION!! DEJA FACTUREE")
  3063. *         ENDIF
  3064.          IF VAL(BON->C_STATUS)=40
  3065.            ALARM("COMMANDE BLOQUEE")
  3066.          ENDIF
  3067.          DO LINESM                   // Modification Lines
  3068.          IF Changed .AND. VAL(BON->C_STATUS)=0
  3069.             CLEAR
  3070.             DO COMM_OUT WITH .T., .F.
  3071.          ENDIF
  3072.          SET CURSOR OFF
  3073.       CASE MCHOIX=4                  // DELETE
  3074.                                      // only packs COM, FACTA packed at FDM
  3075.          IF VAL(C_STATUS)<>09
  3076.             ALARM("COMMANDE DEJA ENVOYEE A FLORENSAC - ANNULATION INTERDIT")
  3077.          ELSE
  3078.             @ b-3,l+1 TO b-1,l+19 DOUBLE
  3079.             IF CONFIRM (20,,"N","CONFIRMATION SUPPRESSION COMMANDE ? ")
  3080.                IF MONTH(D_COMM)=MONTH(MDAT_MAX)
  3081.                   DEL =.T.                         // this month's cde
  3082.                ENDIF
  3083.                DO RESET_SOLDE WITH "-"
  3084.                SELECT BON
  3085.                AREF=COMMANDE
  3086.                REC_LOCK(0)
  3087.                IF DEL
  3088.                  DELETE
  3089.                ELSE
  3090.                 * REPLACE C_STATUS WITH "99"    always delete for now,
  3091.                  DELETE
  3092.                ENDIF
  3093.                UNLOCK
  3094.                SELECT FACTA
  3095.                SEEK AREF
  3096.                DO WHILE FACTURE=AREF .AND. .NOT. EOF()
  3097.                   REC_LOCK(0)
  3098.                   IF SUBSTR(ARTICLE,1,1)<>"+"
  3099.                      OLDART=ARTICLE
  3100.                      OLDQTE=QUANTITE
  3101.                      OLDREP=REPORT
  3102.                      REPLACE REPORT WITH 99       // so as not to do SETPF
  3103.                      DO RESETPF
  3104.                   ENDIF
  3105.                   IF DEL
  3106.                     DELETE
  3107.                   ENDIF
  3108.                   UNLOCK
  3109.                   SKIP
  3110.                ENDDO
  3111.                UNLOCK
  3112.                SELECT(MSEL)
  3113.                DO WOUT WITH t,l,b,r,MBUFF1
  3114.                KEYBOARD CHR(27)+CHR(27)     //Force Terminate
  3115.                RETURN .T.
  3116.             ENDIF
  3117.          ENDIF
  3118.    ENDCASE
  3119.    SET CURSOR OFF
  3120.    Do HLON                     // Equivalent of WIN to make correct Frame
  3121.    @ 0,0 clear to 23,79
  3122.    @ 0,0 to 23,79 double
  3123.    @ 0,32 say "COMMANDE"
  3124.    @ 23,31 SAY "Esc pour terminer"
  3125.    Do HLOFF WITH LCD
  3126.    DO COMM_OUT WITH .F.        // Visualise
  3127. ENDDO
  3128. RETURN .T.
  3129. *
  3130. ****************************************
  3131. *
  3132. FUNCTION LINESM
  3133. *.......................................
  3134. *
  3135. Local Blq:=.F.,MAJMONT,TOTHT,TOTTARIF
  3136.  
  3137. CLEAR
  3138. SELECT BON
  3139. AREF=COMMANDE
  3140. SELECT FACTA
  3141. SEEK AREF
  3142. COPY TO C:TEMPLN WHILE FACTURE=AREF
  3143. UNLOCK
  3144. NET_USE (S_TEMPLN, "C:TEMPLN",  .T., 30, "", "")
  3145. MREC=RECCOUNT()
  3146. Fa=SELECT()
  3147. *
  3148. *FIRST SELECT THE RECORD
  3149. *
  3150. PRIVATE fbuff[8],tbuff[8],sbuff[8]
  3151. Fbuff[1]="ARTICLE"
  3152. Fbuff[2]="LIB"
  3153. Fbuff[3]="QUANTITE"
  3154. Fbuff[4]="PU"
  3155. Fbuff[5]="REM_LINE"
  3156. Fbuff[6]="IIF(REPORT=98,'N','O')"
  3157. Fbuff[7]="PRIXREEL/QUANTITE"
  3158. Fbuff[8]="PRIXREEL"
  3159.    *
  3160. Tbuff[1]="ART"
  3161. Tbuff[2]="LIBELLE"
  3162. Tbuff[3]=" QTE."
  3163. Tbuff[4]="   PRIX U"
  3164. Tbuff[5]="REM "
  3165. Tbuff[6]="LI"
  3166. Tbuff[7]=" PRIX NET"
  3167. Tbuff[8]="  TOTAL NET"
  3168. *
  3169. Sbuff[2]="@S23 "
  3170. Sbuff[3]="9999"
  3171. Sbuff[5]="99"
  3172. Sbuff[7]="@Z ######.##"
  3173. Sbuff[8]="@Z ########.##"
  3174. *
  3175. PUBLIC Changed,PREFACT,TOTPDS,Recalc
  3176. //
  3177. Recalc=.F.
  3178. Changed=.F.
  3179. PREFACT=.F.
  3180. TOTPDS =0                    // in fact TOTPDS is recalculated if MAJ
  3181. SET CURSOR OFF
  3182. IF SELECT("BON")=S_AVO
  3183.    @ 1,0 SAY "AVOIR    : " +AREF
  3184. ELSE
  3185.    @ 1,0 SAY "COMMANDE : " +AREF
  3186. ENDIF
  3187.  
  3188. @ 1,20 SAY CLIENT->CLINOM
  3189. *
  3190. My_DBEDIT(3,0,21,79,Fbuff,"RMAED",Sbuff,Tbuff,"-"," ")
  3191. //
  3192. SUM PRIXREEL TO TOTHT FOR AT(SUBSTR(ARTICLE,1,1),"-*")=0
  3193. * .AND. REPORT=0
  3194. TOTHT=TOTHT*(1-BON->REM_SUP/100)
  3195. SUM PU*QUANTITE TO TOTTARIF FOR AT(SUBSTR(ARTICLE,1,1),"-*")=0
  3196. * .AND. REPORT=0
  3197. *
  3198. TVATOT =IIF(BON->EXPORT=0,0,TOTHT*TVARATE)
  3199. TVATTOT=IIF(BON->EXPORT=0,0,TOTTARIF*TVARATE)
  3200. IF BON->MONTANT=0
  3201.    // remise is  TARIF-NET which is not O if there is a remise line
  3202.    // or a rem sup
  3203.    Remis=(TOTTARIF-TOTHT)/TOTTARIF
  3204. ELSE
  3205.    Remis=(TVATTOT+TOTTARIF-(BON->MONTANT*(1-BON->REM_SUP/100)));
  3206.           /(TVATTOT+TOTTARIF)
  3207. ENDIF
  3208. //  must come out of the next bit with majmont set up
  3209. SET CURSOR ON
  3210. @ 20,0 CLEAR TO 20,79
  3211. IF BON->REM_SUP>0
  3212.   ALARM("Remise exceptionnelle sur la commande = " +STR(BON->REM_SUP,5,2) +" %")
  3213. ENDIF
  3214. @ 20, 1      SAY "TARIF TTC :" +STR(TVATTOT+TOTTARIF,10,2)
  3215. @ 20,COL()+2 SAY "NET TTC :"   +STR(TVATOT+TOTHT,10,2)
  3216. @ 20,COL()+2 SAY "NET HT :"    +STR(TOTHT,10,2)
  3217. @ 20,65      SAY "Remise :"    +STR(Remis*100,5,1)+"%"
  3218. //
  3219. // now proposes in the box either the sum of all prixreels after remsup
  3220. // or the previous montant after rem_sup
  3221. //
  3222. MM=IIF(BON->MONTANT=0,TVATOT+TOTHT,;
  3223.                       ROUND(BON->MONTANT*(1-BON->REM_SUP/100),2))
  3224. Remis=(TVATTOT+TOTTARIF-MM)/(TVATTOT+TOTTARIF)
  3225.  
  3226. IF VAL(BON->C_STATUS)=0 .AND.(Remis*100 > MAXREM1 .OR.;
  3227.      .NOT. CONFIRM (21,,"N","Montant TTC à facturer ? " + STR(MM,11,2)))
  3228.  
  3229.     DO WHILE .T.
  3230.        Blq=.F.
  3231.        @ 22,65 CLEAR TO 23,79
  3232.        SET ESCAPE OFF
  3233.        @ 21,10 SAY "Tapez le montant à facturer :" GET MM PICTURE '99999999.99'
  3234.        READ
  3235.        Remis=(TVATTOT+TOTTARIF-MM)/(TVATTOT+TOTTARIF)
  3236.        @ 20,65      SAY "Remise :"    +STR(Remis*100,5,1)+"%"
  3237.        IF SELECT("BON")<>S_AVO
  3238.           IF Remis*100 > MAXREM1
  3239.              ALARM("REMISE EN DEPASSEMENT")
  3240.              Blq=.T.
  3241.           ENDIF
  3242.        ENDIF
  3243.        ANS="N"
  3244.        @ 22,10 SAY "Confirmation ? (O/N)? " GET ANS
  3245.        READ
  3246.        IF UPPER(ANS)="O"
  3247.           MAJMONT=MM
  3248.           IF Blq
  3249.              ALARM("LA COMMANDE SERA BLOQUEE")
  3250.              Changed =.T.
  3251.           ENDIF
  3252.           EXIT
  3253.        ELSE
  3254.           @ 21,0 CLEAR TO 23,79
  3255.           LOOP
  3256.        ENDIF
  3257.     ENDDO
  3258. ENDIF
  3259. MAJMONT=MM
  3260. SET ESCAPE ON
  3261.  
  3262. IF  MAJMONT<>BON->MONTANT*(1-BON->REM_SUP/100)
  3263.     Changed=.T.
  3264.     Recalc=.T.
  3265. ENDIF
  3266. IF Changed
  3267.    Ln=IIF(RECCOUNT()>15,21,RECCOUNT()+5)
  3268.    DO HLON
  3269.    @ Ln,25 TO Ln+3,54 DOUBLE
  3270.    DO HLOFF WITH LCD
  3271.    CHOIX=1
  3272.    @ Ln+1,28 PROMPT "Mise à jour des fichiers"
  3273.    @ Ln+2,28 PROMPT "Abandon sans mise à jour"
  3274.    MENU TO CHOIX
  3275.    *
  3276.    @ Ln+1,28 CLEAR TO Ln+2,53
  3277.    @ Ln+1,28 SAY "Patientez S.V.P. ......"
  3278.    *
  3279.    IF CHOIX=2                     // abandon
  3280.       Changed = .F.
  3281.    ELSE                           // M A J
  3282.       SELECT BON                  //moved 27/1
  3283.       REC_LOCK(0)
  3284.       REPLACE MONTANT WITH MAJMONT/(1-REM_SUP/100)
  3285.       UNLOCK
  3286.       SELECT TEMPLN
  3287.       DO RECALCPR                 // Mod of 3/1/95 ....
  3288.  
  3289.       TOTPDS=0
  3290.       GO TOP
  3291.       DO C_TOTPDS                  // calcs TOTPDS for all lines report=0 or not
  3292.                                    // whether in TEMPLN or FACTA
  3293.       IF Blq
  3294.          SELECT BON
  3295.          REC_LOCK(0)
  3296.          REPLACE C_STATUS WITH "40"
  3297.          UNLOCK
  3298.       ENDIF
  3299.       SELECT TEMPLN
  3300.       SET RELATION TO FACTURE+LIGNE INTO FACTA
  3301.       GO TOP
  3302.       DO WHILE RECNO()<MREC
  3303.         * CLEAR
  3304.          SELECT FACTA
  3305.          REC_LOCK()
  3306.          REC_LOCK()
  3307.          OLDQTE=QUANTITE
  3308.          OLDART=ARTICLE
  3309.          OLDREP=REPORT
  3310.          REPLACE  ARTICLE WITH TEMPLN->ARTICLE, QUANTITE WITH TEMPLN->QUANTITE,;
  3311.                LIB WITH TEMPLN->LIB, PU WITH TEMPLN->PU
  3312.          REPLACE REPORT WITH TEMPLN->REPORT,PRIXREEL WITH TEMPLN->PRIXREEL,;
  3313.                 TYPE WITH TEMPLN->TYPE,REM_LINE WITH TEMPLN->REM_LINE,;
  3314.                 LINETVA WITH TEMPLN->LINETVA
  3315.          UNLOCK
  3316.          IF  OLDQTE<>QUANTITE .OR. OLDART<>ARTICLE .OR. OLDREP<>REPORT
  3317.             IF OLDREP<>REPORT .AND. REPORT=0
  3318.                // something has changed from delai to immed
  3319.                    PREFACT=.T.
  3320.             ENDIF
  3321.             IF REPORT=0 .AND. SUBSTR(OLDART,1,1)="+" .AND.;
  3322.                 AT(SUBSTR(ARTICLE,1,1),"-*")=0
  3323.                 // last line been changed to a real immediate thing
  3324.                 PREFACT=.T.
  3325.             ENDIF
  3326.             IF REPORT=0 .AND. SUBSTR(OLDART,1,1)="*" .AND.;
  3327.               AT(SUBSTR(ARTICLE,1,1),"-*+")=0
  3328.               // a comment line has been changed to a real immediate thing
  3329.               PREFACT=.T.
  3330.             ENDIF
  3331.  
  3332.             IF SELECT("BON")<>S_AVO
  3333.                  DO RESETPF                   // which does SETPF as well
  3334.             ENDIF
  3335.          ENDIF        // change with "ACTION"
  3336.          SELECT TEMPLN
  3337.          SKIP
  3338.       ENDDO
  3339.       *
  3340.       IF RECCOUNT()>MREC          // Records have been added
  3341.          GO TOP
  3342.          DELETE NEXT MREC-1       // The old "+" record is now re-used
  3343.          GO TOP
  3344.          DELETE FOR SUBSTR(ARTICLE,1,1)="+"
  3345.          PACK
  3346.          IF SELECT("BON")<>S_AVO
  3347.             Fa=SELECT()
  3348.             GO TOP
  3349.             OLDART=SPACE(6)
  3350.             OLDQTE=0
  3351.             DO WHILE .NOT. EOF()
  3352.               IF AT(SUBSTR(ARTICLE,1,1),"+-*")=0
  3353.                  DO RESETPF
  3354.               ENDIF
  3355.               SKIP
  3356.            ENDDO
  3357.          ELSE
  3358.            // Avoirs, do nothing
  3359.          ENDIF
  3360.          USE                  // releases templn
  3361.          SELECT FACTA
  3362.          APPEND FROM C:TEMPLN       // Just the additions
  3363.          SELECT (Fa)               // templn
  3364.       ENDIF          // of added lines in TEMPLN
  3365.  
  3366.       // next bit deals with PREFACT
  3367.  
  3368.       IF PREFACT .AND. (BON->C_STATUS="09" .OR. BON->C_STATUS="10")
  3369.         // at least one line of an entirely delayed commande is to be delivered
  3370.         // and the bon did not come out last time
  3371.          // or this commande is already factured for a partial delivery
  3372.         SELECT BON
  3373.         REC_LOCK()
  3374.         REPLACE C_STATUS WITH "00"
  3375.         UNLOCK
  3376.         SELECT  (Fa)           // dummy
  3377.       ENDIF
  3378.       //
  3379.       // now the bottom bit
  3380.       //
  3381.         SELECT (Fa)      // need this
  3382.    ENDIF     // maj fich
  3383. ENDIF        // of changed
  3384. SELECT(Fa)
  3385. USE           // release templn
  3386. *
  3387.  
  3388. SET CURSOR ON
  3389. ERASE C:TEMPLN.DBF
  3390. CLEAR TYPEAHEAD
  3391. RETURN .T.
  3392.  
  3393. *
  3394. ********
  3395. FUNCTION RECALCPR
  3396. // starts off by resetting ALL prixreels
  3397. // takes the ttc and resets PRIXREEL proportionally in FACTA or TEMPLN
  3398. // with rounding so that the sum of all the lines=ttc/1.186
  3399. // BON is COM AND THE RIGHT DATABASE MUST BE SELECTED  !!!!!!!
  3400.  
  3401. Local La,Re,Diff,Remis,FRED,R_MEM
  3402. La=SELECT()
  3403. *SELECT FACTA              // Mod of 3/1/95 ....
  3404. R_MEM=RECNO()
  3405. GO TOP                     // Mod of 3/1/95 ....
  3406. *SEEK BON->COMMANDE        // Mod of 3/1/95 ....
  3407. Re=RECNO()
  3408. DO WHILE FACTURE=BON->COMMANDE .AND. .NOT. EOF()
  3409.    REC_LOCK()
  3410.    IF AT(SUBSTR(ARTICLE,1,1),"*-+")>0
  3411.       REPLACE PRIXREEL WITH 0,REM_LINE WITH "00",PU WITH 0,QUANTITE WITH 0
  3412.    ELSE
  3413.       REPLACE PRIXREEL WITH CALCPU(PU)*QUANTITE
  3414.    ENDIF
  3415.    UNLOCK
  3416.    SKIP
  3417. ENDDO
  3418. GO Re
  3419. SUM REST PRIXREEL TO MREEL WHILE FACTURE=BON->COMMANDE
  3420. FRED=IIF(BON->EXPORT=0,0,TVARATE)
  3421. MREEL=MREEL*(1-BON->REM_SUP/100)
  3422. MNETHT=ROUND(BON->MONTANT*(1-BON->REM_SUP/100)/(1+FRED),2)
  3423. IF MREEL<>MNETHT
  3424.    // PRIXREEL NEEDS ADJUSTING
  3425.    Remis=(MREEL-MNETHT)/MREEL
  3426.    GO Re
  3427.    DO WHILE .NOT. EOF() .AND. FACTURE=BON->COMMANDE
  3428.      IF AT(SUBSTR(ARTICLE,1,1),"+-*")=0
  3429.         REC_LOCK(0)
  3430.         REPLACE PRIXREEL WITH ROUND(PRIXREEL*(1-Remis),2)
  3431.         UNLOCK
  3432.      ENDIF
  3433.      SKIP
  3434.    ENDDO
  3435.    // check it
  3436.    GO re
  3437.    SUM REST PRIXREEL TO MREEL  WHILE FACTURE=BON->COMMANDE
  3438.    IF MREEL<>MNETHT
  3439.       Diff=MREEL - MNETHT
  3440.       IF ABS(Diff)>0.005
  3441.          ALARM("RECTIFICATION PRIX REEL (en francs)= " +STR(DIFF,9,2))
  3442.       ENDIF
  3443.       GO Re
  3444.       IF AT(SUBSTR(ARTICLE,1,1),"+*-")=0
  3445.         LOCATE REST FOR PRIXREEL>0 WHILE FACTURE=BON->COMMANDE
  3446.           // get the first one
  3447.       ENDIF
  3448.       REC_LOCK(0)
  3449.       REPLACE PRIXREEL WITH PRIXREEL-Diff
  3450.       UNLOCK
  3451.    ENDIF
  3452.    GO Re
  3453. ENDIF
  3454. GO R_MEM     // Position FACTA on the original record
  3455. SELECT(La)
  3456. RETURN .T.
  3457. *
  3458.  
  3459. **************
  3460. FUNCTION RESETPF
  3461.  
  3462. * resets STPORT for OLDART AND OLDQTE (modified lines)
  3463. * irrespective of changes in REPORT
  3464. * All commandes are in STPORT for ANJOU
  3465. * you know it must be done or else you wouldn't be here.
  3466. * never changes the STREEL
  3467.  
  3468. LOCAL Fa
  3469. PRIVATE NEWART,NEWQTE
  3470. RETURN .T.         // Not needed for Portables
  3471. Fa=SELECT()
  3472. NEWART=ARTICLE
  3473. NEWQTE=QUANTITE
  3474. SELECT STOCK
  3475. IF OLDART<>SPACE(6).AND. OLDART<>CODE_DIVERS .AND.(AT(SUBSTR(OLDART,1,1),"-*")=0)
  3476.     SEEK OLDART
  3477.     REC_LOCK(0)
  3478.     REPLACE STPORT WITH STPORT-OLDQTE
  3479.     UNLOCK
  3480. ENDIF
  3481. *
  3482. SELECT (Fa)
  3483. DO SETPF WITH NEWART,NEWQTE,.T.,.F.         // for NEWQTE of modif or saisie
  3484. RETURN .T.
  3485. *
  3486. ****************
  3487.  
  3488. FUNCTION RMAED
  3489. PARAMETERS status, fld_ptr
  3490. PRIVATE a_request,ARTTOT,OLDART,OLDN,OLDP,OLDREM,OLDRP,TOTHT,TVATOT,;
  3491.         CTYPE,NLIGNE,ENDIT,AVOIR
  3492. * PREFACT = .F.
  3493. AVOIR = .F.
  3494. TOTHT = 0
  3495. TVATOT= 0
  3496. *TOTPDS=0
  3497. LN=0
  3498. NLIGNE=0
  3499. ENDIT = .F.
  3500. *CTYPE SET FOR LIGNEIN
  3501. *CTYPE="C"
  3502. key_stroke=LASTKEY()
  3503. DO CASE
  3504.    CASE status=0
  3505.       a_request=1
  3506.    CASE status=1
  3507.       a_request=1
  3508.    CASE status=2
  3509.       a_request=1
  3510.    CASE status=3
  3511.       a_request=1
  3512.    CASE status=4
  3513.       a_request=KeyExcept(key_stroke)
  3514. ENDCASE
  3515. RETURN a_request
  3516. *
  3517. FUNCTION KeyExcept (action_key)
  3518. LOCAL M_RPX
  3519. *
  3520. DO CASE
  3521.    CASE action_key=K_ESC.OR.action_key=K_F9
  3522.       RETURN 0                             // Terminate DBEDIT
  3523.  
  3524.    otherwise
  3525.       IF fld_ptr>=7                        // Can't edit PRIXREEL or TOTAL
  3526.          TONE(100,1)
  3527.          RETURN 1
  3528.       ENDIF
  3529.       IF SUBSTR(ARTICLE,1,1)="-"
  3530.          TONE(100,1)                       // Can't edit deleted article
  3531.          RETURN 1
  3532.       ENDIF
  3533.  
  3534.       if action_key <> K_ENTER
  3535.          keyboard CHR(action_key)
  3536.       endif
  3537.  
  3538.       IF fld_ptr<>1
  3539.          SET CURSOR ON
  3540.          OLDLIB=LIB
  3541.          OLDQTE=QUANTITE
  3542.          OLDPU=PU
  3543.          OLDRP=REPORT
  3544.          OLDREM=REM_LINE
  3545.          MREF=ARTICLE
  3546.          IF fld_ptr=6
  3547.             // REPORT used for articles not to be delivered
  3548.             M_RPX = IIF(OLDRP=98,"N","O")
  3549.             @ROW(),COL() GET M_RPX PICTURE '@!' VALID M_RPX $ "ON"
  3550.             READ
  3551.             REPLACE REPORT WITH IIF(M_RPX="N",98,0)
  3552.          ELSE
  3553.             field_name=Fbuff[fld_ptr]
  3554.             @ROW(),COL() GET &field_name PICTURE Sbuff[fld_ptr]
  3555.             READ
  3556.          ENDIF
  3557.          SET CURSOR OFF
  3558.          IF OLDQTE<>QUANTITE.OR.PU<>OLDPU.OR.OLDRP<>REPORT.OR.OLDREM<>REM_LINE
  3559.             Changed=.T.
  3560.             Recalc=.T.   // set marker to recalculate PRIXREEL
  3561.             REPLACE PRIXREEL WITH CALCPU(PU)*QUANTITE
  3562.          ENDIF
  3563.          IF OLDLIB<>LIB
  3564.             Changed=.T.
  3565.          ENDIF
  3566.          RETURN 2
  3567.       ELSE
  3568.           *
  3569.           * It is the Article
  3570.           SET CURSOR ON
  3571.           DO LIGNEMOD
  3572.           SET CURSOR OFF
  3573.           RETURN 2
  3574.           *
  3575.       ENDIF
  3576.  
  3577. ENDCASE
  3578. RETURN 0
  3579. //
  3580. //-------------------------------------------------------------------
  3581. //
  3582. FUNCTION  FACT (MAJ,Av)
  3583.  
  3584. * Auteur...: R M ALCOCK
  3585. * Date.....: August 31
  3586. * Copyright: (c) 1992, R M ALCOCK, Tous droits réservés
  3587. * Notes....: FACTURE /AVOIR (not FACTURATION !) visu / modif
  3588. *          : now a file by itself and not a procedure file
  3589. *
  3590.  
  3591. LOCAL La
  3592. La=SELECT()
  3593. SELECT BON
  3594.  
  3595. DEFAULT MAJ TO .F.
  3596. DEFAULT Av  TO .F.
  3597.  
  3598. IF .NOT. MAJ
  3599.    SET INTENSITY OFF
  3600. ELSE
  3601.    REC_LOCK()
  3602. ENDIF
  3603. *
  3604. *
  3605. IF Av
  3606.    @ 3,4 SAY " AVOIR    : "+FACTURE  +"  du  "
  3607.    @ ROW(), COL() GET DFACT RANGE  ;
  3608.       CTOD("01/" + STR(MONTH(SYSDATE()),2) +"/" + STR(YEAR(SYSDATE())-1900,2)),;
  3609.        SYSDATE()
  3610.  
  3611. ELSE
  3612.  
  3613.    @ 3,4 SAY " FACTURE  : "+FACTURE+"/"+ECH+"  du  "
  3614.    @ ROW(), COL() GET DFACT  RANGE  ;
  3615.       CTOD("01/" + STR(MONTH(SYSDATE()),2) +"/" + STR(YEAR(SYSDATE())-1900,2)),;
  3616.        SYSDATE()
  3617.  
  3618. ENDIF
  3619. @ ROW()+2,4 SAY " V.R.P.   :" GET REGION
  3620. @ ROW()+1,4 SAY " COMMANDE :" GET COMMANDE
  3621. @ ROW(),COL()+4 SAY "CLIENT :"+REFCLI+"  "+ CLIENT->CLINOM
  3622. @ ROW()+1,4 SAY " STATUS   : "
  3623. IF VAL(C_STATUS)>0
  3624.    @ ROW(),COL() GET C_STATUS
  3625. ELSE
  3626.    @ ROW(),COL() SAY C_STATUS
  3627. ENDIF
  3628. IF .NOT. Av
  3629.   @ ROW(),COL()+4 SAY "DATE COMMANDE  :" GET D_COMM
  3630. ENDIF
  3631. @ ROW(),COL()+4 SAY "REF :" GET CLI_COMM
  3632. @ ROW()+1,4 SAY " EXPORT   :" GET FACT->EXPORT
  3633. @ ROW(),COL()+5 SAY "DATE LIVRAISON :" GET D_LIVR
  3634. @ ROW(),COL()+4 SAY " % REMISE SUP :" GET REM_SUP
  3635. @ ROW()+1,4 SAY " POIDS    :"
  3636. @ ROW(),COL() GET TOT_POIDS
  3637. *@ ROW(),COL()+6 SAY " PORT  :" GET PORT
  3638. @ ROW()+2,4 SAY "LIVRAISON :" GET LIVR_NOM
  3639. @ ROW()+1,16 GET LIVR_RUE
  3640. @ ROW()+1,16 GET LIVR_ADS
  3641. @ ROW()+1,16 GET LIVR_CP
  3642. @ ROW(),COL()+3 GET LIVR_VILLE
  3643.  
  3644. @ ROW()+2,4 SAY "TOTAL TTC : "
  3645. @ ROW(),COL()+1 GET MONTANT RANGE 0,9999999
  3646. IF .NOT. Av
  3647. *   @ ROW(),COL()+4 SAY "   NOMBRE ECH. :" GET NUM_ECH
  3648.    @ ROW(),COL()+4 SAY "CODE PAIEMENT  :" GET CP1
  3649.  
  3650.    @ ROW()+2,4 SAY "ECHEANCE  : "
  3651.    @ ROW(),COL()+1 GET MECH1 RANGE 0,9999999
  3652.    @ ROW(),COL()+4 SAY " DATE ECHEANCE : "
  3653.    @ ROW(),COL()+1 GET DECH1
  3654. ENDIF
  3655. @ ROW(),COL()+6 SAY "REGLE : "
  3656. IF VAL(C_STATUS)>0
  3657.    @ ROW(),COL()+1 GET RECH1 PICTURE "Y"
  3658. ELSE
  3659.    @ ROW(),COL()+1 SAY RECH1
  3660. ENDIF
  3661. IF MAJ
  3662.    READ
  3663.    UNLOCK
  3664. ELSE
  3665.    CLEAR GETS
  3666. ENDIF
  3667.  
  3668. SET INTENSITY ON
  3669.  
  3670. SELECT (La)
  3671. RETURN .T.
  3672.  
  3673. //
  3674. //-------------------------------------------------------------------
  3675. //
  3676.  
  3677. FUNCTION SETPF (NEWART,NEWQTE,DOSTPORT,DOSTREEL)
  3678.  
  3679. * Auteur...: R M ALCOCK
  3680. * Date.....: 22 April 1994
  3681. * Copyright: (c) 1994, R M ALCOCK, Tous droits réservés
  3682. * Notes....: Procedure which was in COMPROC and now is here for the facturation
  3683. *          : STOCK and STCOMP must be opened
  3684. *
  3685. LOCAL Fa
  3686. //
  3687. // If DOSTPORT it ADDS NEWQTE to STPORT
  3688. // If DOSTREEL then it ADDS NEWQTE to STREEL, this is for avoirs with maj stock
  3689. // locks and unlocks
  3690. // FACTA must be selected
  3691. //
  3692. Fa = SELECT ()
  3693. SELECT STOCK
  3694. IF NEWART<>CODE_DIVERS .AND. SUBSTR(NEWART,1,1)<>"-".AND. SUBSTR(NEWART,1,1)<>"*"
  3695.    SEEK NEWART
  3696.    IF FOUND()
  3697.       REC_LOCK(0)
  3698.       IF DOSTPORT
  3699.           REPLACE STPORT WITH STPORT+NEWQTE
  3700.       ENDIF
  3701.       IF DOSTREEL .AND. STTYP="S"             // S for stocked articles ANJOU
  3702.          REPLACE STREEL WITH STREEL + NEWQTE
  3703.       ENDIF
  3704.       UNLOCK
  3705.    ENDIF
  3706. ENDIF
  3707.  
  3708. SELECT(Fa)
  3709. RETURN .T.
  3710. //
  3711. //--------------------------------------------------------------------------
  3712. //
  3713. * Programme: HELPPRG.PRG
  3714. * Auteur...: R M ALCOCK
  3715. * Date.....: 26/11/93
  3716. * Copyright: (c) 1993, R M ALCOCK, Tous droits réservés
  3717. * Notes....: HELP system
  3718. *
  3719. *
  3720. FUNCTION help_me ( mproc,The_line,The_var )
  3721. local t,l:=0,b,r:=79, zbuff:="", mr,mcol,mht:= {}, choix:=1
  3722. LOCAL C_String
  3723.  
  3724. mr=row()                            // Save current cursor posn.
  3725. mcol=col()
  3726. ml=1                                // Most help just one line
  3727. * Get rid of alias from The_Var
  3728. The_Var = IIF (at(">",The_Var)=0, The_Var, substr(The_Var, at(">",The_Var)+1, len(The_Var)))
  3729. //
  3730. // Handle COMMENT as a special case
  3731. //
  3732. IF mproc="T_COMMENT".OR. The_Var="COMMENTAIR" .OR. mproc="ED_MEMO"
  3733.    //
  3734.    // C_String is pairs of control characters to send to MEMOEDIT
  3735.    //
  3736.    C_String :=         CHR(0)+CHR(0)  +CHR(23)+CHR(27) +CHR(27)+CHR(27)
  3737.    C_String=C_String + CHR(25)+CHR(0) +CHR(20)+CHR(0)  +CHR(2)+CHR(0)
  3738.  
  3739.    t=15
  3740.    l=48
  3741.    b=22
  3742.    do win with t,l,b,r,zbuff,"AIDE"
  3743.  
  3744.    @ t+1,     l+3 PROMPT "Continuer la modification"
  3745.    @ ROW()+1, L+3 PROMPT "Sauve et Terminer"
  3746.    @ ROW()+1, L+3 PROMPT "Terminer sans sauvegarde"
  3747.    @ ROW()+1, L+3 PROMPT "Efface Ligne"
  3748.    @ ROW()+1, L+3 PROMPT "Efface Mot"
  3749.    @ ROW()+1, L+3 PROMPT "Reformatage Paragraphe"
  3750.    MENU TO CHOIX
  3751.  
  3752.    CHOIX=CHOIX*2-1
  3753.    KEYBOARD SUBSTR(C_String, CHOIX, 2)
  3754.  
  3755.    do wout with t,l,b,r,zbuff
  3756.    @mr,mcol say ""                     // Reset cursor position
  3757.    return .T.
  3758. ENDIF
  3759.  
  3760. ALARM (mproc+" "+str(The_line)+" "+The_var)
  3761.  
  3762.  
  3763. t=10
  3764. l=4
  3765. b=t+10
  3766. r=l+40
  3767. do win with t,l,b,r,zbuff,"AIDE"
  3768.  
  3769. @ t+1,     l+3 PROMPT "Sélection CLient(s)"
  3770. @ ROW()+1, L+3 PROMPT "Profession / Activité"
  3771. @ ROW()+1, L+3 PROMPT "Choisir un article"
  3772. @ ROW()+1, L+3 PROMPT "Modification Ligne de commande"
  3773. @ ROW()+1, L+3 PROMPT "Code Paiement"
  3774. @ ROW()+1, L+3 PROMPT "Reformatage Paragraphe"
  3775. MENU TO CHOIX
  3776.  
  3777. do wout with t,l,b,r,zbuff
  3778. IF LASTKEY() = K_ESC
  3779.    RETURN .F.
  3780. ENDIF   
  3781.  
  3782. DO CASE
  3783.   //
  3784.    CASE CHOIX = 1
  3785.      AADD (MHT, "Recherche par Code Postale ou Nom = Tapez les premiers chiffres")
  3786.      AADD (MHT, "Numéro Client = Cxxxxxxxxx pour un client ou Pxxxxxxxx pour un prospect")
  3787.      AADD (MHT, "")
  3788.      AADD (MHT, "Pour créer un client/prospect, renseignez les zones 'NOM' et 'Code Postale'")
  3789.      AADD (MHT, "              et mettre '*' à gauche en zone 'NUMERO' (Création prospect)")
  3790.      AADD (MHT, "                          ou son numéro (Cxxxxxxxxx)  (Création Client)")
  3791.  
  3792.   CASE CHOIX = 2
  3793.      AADD (MHT, SUBSTR(ValidProff,1,60))
  3794.      AADD (MHT, SUBSTR(ValidProff,61))
  3795.  
  3796.    CASE CHOIX = 3
  3797.      AADD (MHT, "F5 pour le catalogue / tarif")
  3798.  
  3799.    CASE CHOIX = 4
  3800.      AADD (MHT, [Si vous voulez changer l'article, selectionnez "ART" avec <-])
  3801.      AADD (MHT, "vous pouvez ensuite tapez F5 pour obtenir le tarif / catalogue")
  3802.      AADD (MHT, "")
  3803.      AADD (MHT, "Sélectionnez le '+' pour ajouter une ligne")
  3804.      AADD (MHT, "")
  3805.      AADD (MHT, [les zones :])
  3806.      AADD (MHT, [  "LI"      est "O" si la ligne est à livrée sinon "N"])
  3807.      AADD (MHT, [  "PRIX U"  est normalement le prix tarif, mais vous pouvez le modifier])
  3808.      AADD (MHT, [  "REM"     est la % remise a appliquer à cette ligne])
  3809.      AADD (MHT, "")
  3810.      AADD (MHT, "Tapez Esc pour terminer la saisie")
  3811.  
  3812.   CASE CHOIX = 5
  3813.      AADD (MHT, "CODE PAIEMENT  - Si Montant = 0, Code = Espace , sinon:")
  3814.      AADD (MHT, "0 - Déjà reglé")
  3815.      AADD (MHT, "2 - Traite à la livraison")
  3816.      AADD (MHT, "3 - Cheque joint")
  3817.      AADD (MHT, "5 - Cheque à la livraison")
  3818.      AADD (MHT, "6 - Traite à l'acceptation")
  3819.      AADD (MHT, "7 - Traite acceptée (L.C.R.)")
  3820.      AADD (MHT, "9 - Financement")
  3821.  
  3822.   CASE The_Var="CLIABV"
  3823.      AADD (MHT, "Forme juridique,  S.A., SARL, ENT .....")
  3824.  
  3825.   CASE The_Var="CLICONTACT"
  3826.      AADD (MHT, "Entrez le nom du client si différent du nom société")
  3827.  
  3828.   CASE The_Var="CLITAILLE"
  3829.      AADD (MHT, "Nombre de personnes dans l'entreprise")
  3830.  
  3831.   CASE The_Var="CLIRUE" .OR. The_Var="CLIADS" .OR. The_Var="CLICP" .OR. The_Var="CLIVILLE"
  3832.      AADD (MHT, "Adresse du client")
  3833.  
  3834.   CASE The_Var="CLIBANK" .OR. The_Var="CLIBANKADS"
  3835.      AADD (MHT, "Nom et adresse de la Banque du client")
  3836.  
  3837.   CASE The_Var="CLIBCGUI" .OR. The_Var="CLIBCODE" .OR.;
  3838.        The_Var="CLIBNCPT" .OR. The_Var="CLIBRIB"
  3839.      AADD (MHT, "RIB du client - CODE BANQUE, GUICHET, COMPTE, CLE")
  3840.  
  3841.   CASE SUBSTR(The_Var,1,3) = "QL_"
  3842.      AADD (MHT, "Nom et unité du matériel concurrent")
  3843.  
  3844.   CASE SUBSTR(The_Var,1,3) = "QC_"
  3845.      AADD (MHT, "Quantité de matériel concurrent")
  3846.  
  3847.   CASE The_Var="CLI_COMM"
  3848.      AADD (MHT, "Référence donné par le client à cette commande")
  3849.  
  3850.   CASE The_Var="REM_SUP"
  3851.      AADD (MHT, "Remise a appliquer sur cette commande")
  3852.  
  3853.   CASE The_Var = "EXPORT"
  3854.      AADD (MHT, "1 = France     0=Export (TVA=0)")
  3855.  
  3856.   CASE SUBSTR(The_Var,1,4)="DECH"
  3857.      AADD (MHT, "Date d'echéance")
  3858.  
  3859.    OTHERWISE
  3860. *     // next bit of code is useful for debugging
  3861. *     AADD (MHT, "MPROC = " + MPROC)
  3862. *     AADD (MHT, "LINE  = " + STR(LINE))
  3863. *     AADD (MHT, "The_Var   = " + The_Var)
  3864.      AADD (MHT, "Aide n'est pas disponible")
  3865. ENDCASE
  3866. *
  3867. t=22-LEN(MHT)
  3868. b=t+1+LEN(MHT)
  3869. l=0
  3870. r=79
  3871. do win with t,l,b,r,zbuff,"AIDE"
  3872. FOR I=1 TO LEN(MHT)
  3873.    @ T+I,l+3 say MHT[I]
  3874. NEXT
  3875. //
  3876. do while INKEY(0) <> K_ESC
  3877. enddo
  3878. do wout with t,l,b,r,zbuff
  3879. @mr,mcol say ""                     // Reset cursor position
  3880. return .T.
  3881. *
  3882. //
  3883. //------------------------------------------------------------------------
  3884. //
  3885. FUNCTION ENCODE (CONTROL)
  3886. * Auteur...: R M ALCOCK
  3887. * Date.....: 26/2/95
  3888. * Copyright: (c) 1995, R M ALCOCK, Tous droits réservés
  3889. * Notes....: Subroutines to encode data
  3890. *
  3891. *
  3892. LOCAL SEED,C
  3893. DEFAULT CONTROL TO ""
  3894. *
  3895. SET CONFIRM     ON
  3896. SET DATE        FRENCH
  3897. SET DELETED     ON
  3898. SET EXACT       ON
  3899. SET EXCLUSIVE   OFF
  3900. SET FIXED       OFF
  3901. SET SCOREBOARD  ON
  3902. SET TALK        OFF
  3903. SET BELL        OFF
  3904. SET EPOCH TO 1980
  3905.  
  3906. PUBLIC LCD:=.T., M_Control
  3907.  
  3908. CLOSE DATABASES
  3909. SELECT 1
  3910. USE ATTACH
  3911. M_Control = PCON         // Password Control
  3912.  
  3913. USE CLIENT EXCLUSIVE
  3914.  
  3915. SEED=VAL(READ_SEED(6,5,;
  3916.          IIF (CONTROL="", "DECRYPTAGE FICHIER", "CODAGE FICHIER")))
  3917. @ 6,0 CLEAR
  3918.  
  3919. IF CONTROL = ""
  3920.    // Should be unscramble
  3921.    GO TOP
  3922.    COUNT NEXT 10 FOR CLISCRAMBL TO C
  3923.    IF C < 10 .AND. .NOT. CONFIRM (5,,"N","CONFIRM DECRYPTAGE")
  3924.          QUIT
  3925.    ENDIF
  3926.    //
  3927.    GO TOP
  3928.    @ 6,0 SAY "DECRYPTAGE FICHIER"
  3929.  
  3930.    DO WHILE .NOT. EOF()
  3931.       SPEEDO (8,RECCOUNT())
  3932.       UNSCRAM_CLI(SEED)
  3933.       SKIP
  3934.    ENDDO
  3935.    //
  3936. ELSE
  3937.    //
  3938.    @ 6,0 SAY "CODAGE FICHIER"
  3939.  
  3940.    DO WHILE .NOT. EOF()
  3941.       SPEEDO (8,RECCOUNT())
  3942.       SCRAM_CLI(SEED)
  3943.       SKIP
  3944.    ENDDO
  3945. ENDIF
  3946. ?"Indexation REF"
  3947. INDEX ON CLIREF TO CLIREF
  3948. ?"Indexation CODE POSTALE"
  3949. INDEX ON CLICP+SUBSTR(CLIVILLE,1,5) TO CLICP
  3950. ?"Indexation NOM"
  3951. INDEX ON CLINOM TO CLINOM
  3952. //
  3953. //
  3954. RETURN .T.
  3955. //
  3956. //
  3957. //-------------------------------------------------------------------------
  3958. //
  3959. // Function scrambles a CLIENT record
  3960. //
  3961. FUNCTION SCRAM_CLI (SEED)
  3962. //
  3963. // SEED is the seed for the random number generator
  3964. //
  3965. LOCAL M_FIX:= RANDOM (SEED, 5, 31)   // Generate 5 random n°s between 1 and 31
  3966. LOCAL M_VAR:= RANDOM(REC_SEED (SEED), 30, 31)    // 30 codes.
  3967. LOCAL M,N
  3968. //
  3969. // M_FIX is used for those variables which are indexed and therefore must
  3970. // use the same translation for all
  3971. //
  3972. // M_VAR increases the degree of randomness because the seed is different
  3973. // for each record. Hence the translation is different for the same
  3974. // parameters in different records
  3975. //
  3976. //
  3977. IF CLISCRAMBL
  3978.    RETURN .T.        // Already scrambled
  3979. ENDIF
  3980. //
  3981. // Scramble CLINOM and VILLE  using fixed translation for the first 5 chars
  3982. // and variable translation for the rest. All others are variable
  3983. //
  3984. M =   SCRAMBLE (SUBSTR(CLINOM,1,5), M_FIX)
  3985. M=M + SCRAMBLE (SUBSTR(CLINOM, 6, LEN(CLINOM)-5), M_VAR)
  3986. N=    SCRAMBLE (SUBSTR(CLIVILLE, 1, 5), M_FIX)
  3987. N=N + SCRAMBLE (SUBSTR(CLIVILLE, 6, LEN(CLIVILLE)-5), M_VAR)
  3988. REPLACE CLINOM     WITH M,;
  3989.         CLIVILLE   WITH N,;
  3990.         CLIRUE     WITH SCRAMBLE (CLIRUE,     M_VAR),;
  3991.         CLIADS     WITH SCRAMBLE (CLIADS,     M_VAR),;
  3992.         CLISIRET   WITH SCRAMBLE (CLISIRET,   M_VAR),;
  3993.         CLICONTACT WITH SCRAMBLE (CLICONTACT, M_VAR),;
  3994.         CLICONTAC2 WITH SCRAMBLE (CLICONTAC2, M_VAR)
  3995.  
  3996. REPLACE CLIPHONE  WITH SCRAMBLE (CLIPHONE,  M_VAR),;
  3997.         CLIPHONED WITH SCRAMBLE (CLIPHONED, M_VAR),;
  3998.         CLIPHONEV WITH SCRAMBLE (CLIPHONEV, M_VAR),;
  3999.         CLIFAX    WITH SCRAMBLE (CLIFAX,    M_VAR),;
  4000.         CLIBNCPT  WITH SCRAMBLE (CLIBNCPT,  M_VAR),;
  4001.         CNTRL     WITH SCRAMBLE (CNTRL,     M_VAR),;
  4002.         CLISCRAMBL WITH .T.
  4003. RETURN .T.
  4004. //
  4005. //
  4006. //-------------------------------------------------------------------------
  4007. //
  4008. // Function unscrambles a CLIENT record
  4009. //
  4010. FUNCTION UNSCRAM_CLI (SEED)
  4011. //
  4012. LOCAL M_FIX:= RANDOM (SEED, 5, 31)   // Generate 5 random n°s between 1 and 31
  4013. LOCAL M_VAR:= RANDOM(REC_SEED (SEED), 30, 31)    // 30 codes.
  4014. LOCAL M, N
  4015. //
  4016. // See comments on SCRAM_CLI
  4017. //
  4018. IF .NOT. CLISCRAMBL
  4019.    RETURN .T.        // Already unscrambled
  4020. ENDIF
  4021. M =   UNSCRAMBLE (SUBSTR(CLINOM,1,5), M_FIX)
  4022. M=M + UNSCRAMBLE (SUBSTR(CLINOM, 6, LEN(CLINOM)-5), M_VAR)
  4023. N=    UNSCRAMBLE (SUBSTR(CLIVILLE, 1, 5), M_FIX)
  4024. N=N + UNSCRAMBLE (SUBSTR(CLIVILLE, 6, LEN(CLIVILLE)-5), M_VAR)
  4025.  
  4026. REPLACE CLINOM     WITH M,;
  4027.         CLIVILLE   WITH N,;
  4028.         CLIRUE     WITH UNSCRAMBLE (CLIRUE,     M_VAR),;
  4029.         CLIADS     WITH UNSCRAMBLE (CLIADS,     M_VAR),;
  4030.         CLISIRET   WITH UNSCRAMBLE (CLISIRET,   M_VAR),;
  4031.         CLICONTACT WITH UNSCRAMBLE (CLICONTACT, M_VAR),;
  4032.         CLICONTAC2 WITH UNSCRAMBLE (CLICONTAC2, M_VAR)
  4033.  
  4034. REPLACE CLIPHONE   WITH UNSCRAMBLE (CLIPHONE,  M_VAR),;
  4035.         CLIPHONED  WITH UNSCRAMBLE (CLIPHONED, M_VAR),;
  4036.         CLIPHONEV  WITH UNSCRAMBLE (CLIPHONEV, M_VAR),;
  4037.         CLIFAX     WITH UNSCRAMBLE (CLIFAX,    M_VAR),;
  4038.         CLIBNCPT   WITH UNSCRAMBLE (CLIBNCPT,  M_VAR),;
  4039.         CNTRL      WITH UNSCRAMBLE (CNTRL,     M_VAR),;
  4040.         CLISCRAMBL WITH .F.
  4041. RETURN .T.
  4042. //
  4043. //
  4044. //-------------------------------------------------------------------------
  4045. //
  4046. // Function creates a seed from a fixed seed (1000 - 9999) and RECNO()
  4047. //
  4048. FUNCTION REC_SEED (SEED)
  4049. //
  4050. IF SEED >= 0                  // If not, it is the SERVER - leave alone
  4051.    SEED = RECNO() * 10000 + SEED
  4052.    DO WHILE SEED > 9999
  4053.       SEED = SEED / 7         // Largest prime under 10
  4054.    ENDDO
  4055. ENDIF
  4056. RETURN SEED
  4057. //
  4058. //-------------------------------------------------------------------------
  4059. //
  4060. // Function scrambles a string
  4061. //
  4062. // Each character of R_STRING (a series of random numbers between 1 and 31) is
  4063. // added to its equivalent character in A_STRING so as to scramble it
  4064. //
  4065. FUNCTION SCRAMBLE (A_String, R_String)
  4066. //
  4067. LOCAL I,Ans:=""
  4068. //
  4069. IF LEN(A_String) > 0
  4070.    FOR I=1 TO LEN (A_String)
  4071.       Ans=Ans+CHR(ASC(SUBSTR(A_String,I,1))+ASC(SUBSTR(R_String,I,1)))
  4072.    NEXT
  4073. ENDIF
  4074. RETURN Ans
  4075. //
  4076. //
  4077. //-------------------------------------------------------------------------
  4078. //
  4079. // Function unscrambles a string
  4080. //
  4081. // Each character of R_STRING (a series of random numbers between 1 and 31) is
  4082. // subtracted from its equivalent character in A_STRING so as to unscramble it
  4083. //
  4084. FUNCTION UNSCRAMBLE (A_String, R_String)
  4085. //
  4086. LOCAL I,Ans:=""
  4087.  
  4088. IF LEN(A_String) > 0
  4089.    FOR I=1 TO LEN (A_STRING)
  4090.       Ans=Ans+CHR(ASC(SUBSTR(A_String,I,1))-ASC(SUBSTR(R_String,I,1)))
  4091.    NEXT
  4092. ENDIF
  4093. RETURN Ans
  4094. //
  4095. //-------------------------------------------------------------------------
  4096. //
  4097. // Function generates an string full of random characters
  4098. //
  4099. // PARAMETERS: SEED  = a 4 digit number used to seed the generator
  4100. //             No    = the number of random characters required
  4101. //             Max   = the maximum character value
  4102. //                     i.e. each character is between 1 and Max inclusive
  4103. //
  4104. //     Returns Ans   = A string of length No containing the random chacters
  4105. //
  4106. FUNCTION RANDOM (SEED, No, Max)
  4107. //
  4108. LOCAL Ans:="", IC, MF, MC, MS
  4109.  
  4110. IF SEED < 0                 // No Coding required
  4111.    RETURN REPLICATE(CHR(0),No)
  4112. ENDIF
  4113.  
  4114. FOR IC = 1 TO No
  4115.  
  4116.    // Make sure that the seed does not have an exact square root !!!
  4117.    //
  4118.    DO WHILE .T.
  4119.       MS=SQRT (SEED)
  4120.       MS=(MS * 10000 - INT(MS * 10000)) // Take off 1st 4 digits of fraction
  4121.       IF MS <> 0                        // There is still a fractional part
  4122.          EXIT                           // so it is O.K.
  4123.       ENDIF
  4124.       SEED = SEED+1                     // Try the next integer up
  4125.    ENDDO
  4126.  
  4127.    MF = SQRT(SEED)-INT(SQRT(SEED))      // Fractional part of square root
  4128.    MC = INT( MF * Max )                 // Range is 0 to Max-1
  4129.    Ans = Ans + CHR(MC+1)                // Add to answer string
  4130.    SEED = INT(MF * 10000)               // New seed (4 digits)
  4131.  
  4132. NEXT
  4133. RETURN Ans
  4134. //
  4135. //-------------------------------------------------------------------------
  4136. //
  4137. FUNCTION SPEEDO(MRow,Mlong)
  4138. *
  4139. @ MRow, 79*RECNO()/Mlong SAY "▌"
  4140. RETURN .T.
  4141. //
  4142. //-------------------------------------------------------------------------
  4143. //
  4144. FUNCTION READ_SEED (MROW,MCOL, MT, M_Reg)
  4145.  
  4146. // The equivalent of PASSWD()
  4147. // Requires a GLOBAL variable M_Control containing the 6 character
  4148. // control field from ATTACH->PCON
  4149.  
  4150.  
  4151. LOCAL MPW, I:=0, C
  4152. *
  4153. DO HLOFF WITH LCD
  4154. CLEAR
  4155.  
  4156. FOR i=1 TO 9999
  4157.    MPW = STR(i,4,0)
  4158.    IF M_Control == RANDOM(VAL(MPW),6,31)
  4159.       RETURN MPW  // Password is O.K.
  4160.    ENDIF
  4161. NEXT
  4162. ALARM ("ACCES INTERDIT")
  4163. QUIT
  4164. RETURN 0
  4165.  
  4166.  
  4167. @ 2,40-LEN(MT)/2 SAY MT
  4168. @ 1,40-LEN(MT)/2-2 TO 3,40+LEN(MT)/2+2 DOUBLE
  4169. IF PCOUNT() > 3
  4170.    @ 5,5 SAY "NUMERO VRP   : "+M_Reg
  4171. ENDIF
  4172.  
  4173. @ 23,75 SAY "V9.1"
  4174.  
  4175. DO WHILE I < 3
  4176.  
  4177.    CLEAR TYPEAHEAD
  4178.    MPW=""
  4179.    @ MROW,0 CLEAR TO MROW,79
  4180.    @ MROW,MCOL SAY "MOT DE PASSE ? "
  4181.    //
  4182.    // DO Reads in the user's attempt at the password
  4183.    //
  4184.    DO WHILE .T.
  4185.       C=INKEY(0)
  4186.       DO CASE
  4187.       CASE C=13
  4188.          EXIT
  4189.       CASE C>31.AND.C<127
  4190.          @ ROW(),COL() SAY "*"
  4191.          MPW=MPW+CHR(C)
  4192.       CASE (C=8.OR.C=19).AND.LEN(MPW)>0    // Backspace or left arrow
  4193.          @ROW(),COL()-1 SAY " "
  4194.          @ROW(),COL()-1 SAY ""
  4195.          MPW=SUBSTR(MPW,1,LEN(MPW)-1)
  4196.       ENDCASE
  4197.    ENDDO
  4198.    //
  4199. *   // !!!!!!!!!!!!!!!!!!!!!
  4200. *   //
  4201. *   SELECT 2
  4202. *   USE ATTACH EXCLUSIVE
  4203. *   REPLACE PCON WITH RANDOM(VAL(MPW),6,31)
  4204. *   SELECT CLIENT
  4205. *   RETURN MPW
  4206. *   //
  4207. *   //!!!!!!!!!!!!!!!!!!!!!!!
  4208. *   //
  4209.    IF EMPTY(MPW)
  4210. *      RETURN "-1" // File is not coded
  4211.    ELSEIF M_Control == RANDOM(VAL(MPW),6,31)
  4212.       RETURN MPW  // Password is O.K.
  4213.    ENDIF
  4214.  
  4215.    I=I+1
  4216. ENDDO
  4217.  
  4218. ALARM ("ACCES INTERDIT")
  4219. QUIT
  4220. RETURN .F.
  4221. //
  4222. //-------------------------------------------------------------------
  4223. //
  4224. FUNCTION REINDEX (M_ALL)
  4225. * Auteur...: R M ALCOCK
  4226. * Date.....: 15/2/93
  4227. * Copyright: (c) 1992, R M ALCOCK, Tous droits réservés
  4228. * Notes....: RE-INDEX PROGRAM
  4229. *            Intended to create NTX type Indexes
  4230. *            Link File uses RMALIBX which has no references to DBFNDX
  4231. *
  4232. *
  4233. LOCAL MT:=CONAME+" - INDEX FICHIERS"
  4234. LOCAL MP:=40-LEN(MT)/2
  4235. LOCAL NumFiles := 15                //Number of Databases !!!
  4236. LOCAL I, CHOIX
  4237.  
  4238. *SET DEFAULT TO F:
  4239. SET CONFIRM     ON
  4240. SET DATE        FRENCH
  4241. SET DELETED     ON
  4242. SET EXACT       ON
  4243. SET EXCLUSIVE   OFF
  4244. SET FIXED       OFF
  4245. SET SCOREBOARD  OFF
  4246. SET WRAP        ON
  4247. SET EPOCH TO    1980
  4248. *
  4249. CLEAR
  4250. *
  4251. IF PCOUNT()=0
  4252.    M_ALL = .F.
  4253. ELSE
  4254.    M_ALL = IIF ( M_ALL<> "*", .F., .T.)
  4255. ENDIF
  4256. IF M_ALL
  4257.    @ 0,MP SAY MT
  4258.    @ 5,5 SAY "Index tous les fichiers !!!"
  4259.    FOR I=1 TO NumFiles
  4260.       R_IND (I)
  4261.    NEXT
  4262. ELSE
  4263.    DO WHILE .T.
  4264.       CLEAR
  4265.       @ 0,MP SAY MT
  4266.       @ 2,2 PROMPT "Q U I T T E R"
  4267.       @ ROW()+1,2 PROMPT "TARIF"
  4268.       @ ROW()+1,2 PROMPT "VRPS"
  4269.       @ ROW()+1,2 PROMPT "CLIENTS"
  4270.       @ ROW()+1,2 PROMPT "FAMILLES"
  4271.       @ ROW()+1,2 PROMPT "COMMANDES CLIENTS"
  4272.       @ ROW()+1,2 PROMPT "FACTURES Clients"
  4273.       @ ROW()+1,2 PROMPT "LIGNES de Facturation / Avoirs / Commandes"
  4274.       @ ROW()+1,2 PROMPT "EVENEMENTS / LITIGES / VISITES Clients"
  4275.       @ ROW()+1,2 PROMPT "PROMOTIONS"
  4276.       MENU TO CHOIX
  4277.       IF CHOIX=1
  4278.          RETURN .T.
  4279.       ENDIF
  4280.       R_IND(CHOIX-1)
  4281.       WAIT
  4282.    ENDDO
  4283. ENDIF
  4284. RETURN .T.
  4285. *
  4286. ******************************
  4287. *
  4288. FUNCTION R_IND(CHOIX)
  4289.  
  4290. DO CASE
  4291.  
  4292. CASE CHOIX = 1
  4293. *   NET_USE (1, "STOCK", .T., 30, "", "")
  4294. *   ANNOUNCE_IT()
  4295. *   INDEX ON STCOMMREF TO STCREF
  4296. *   INDEX ON STFAM_PROD+STCOMMREF TO STREF
  4297. *   NET_USE (1, "STCOMP", .T., 30, "", "")
  4298.  *  ANNOUNCE_IT()
  4299.  *  INDEX ON cref TO STCOMP
  4300.  
  4301. CASE CHOIX = 2
  4302.    IF FILE("VRPS.DBF")
  4303.       NET_USE (1, "VRPS", .T., 30, "", "")
  4304.       ANNOUNCE_IT()
  4305.       INDEX ON VRP TO VRPS
  4306.       INDEX ON EQUIPE+VRP TO VRPREG
  4307. *      NET_USE (1, "VRPSTOCK", .T., 30, "", "")
  4308. *      ANNOUNCE_IT()
  4309. *      INDEX ON VRP TO VRPSTOCK
  4310.  
  4311.    ENDIF
  4312.  
  4313. CASE CHOIX = 3
  4314.    NET_USE (1, "CLIENT", .T., 30, "", "")
  4315.    ANNOUNCE_IT()
  4316.    INDEX ON CLIREF TO CLIREF
  4317.    INDEX ON CLICP+SUBSTR(CLIVILLE,1,5) TO CLICP
  4318.    INDEX ON SUBSTR(CLINOM,1,5) TO CLINOM
  4319.  
  4320. CASE CHOIX = 4
  4321.    NET_USE (1, "TARIFT", .T., 30, "", "")
  4322.    ANNOUNCE_IT()
  4323.    INDEX ON CODE TO TARIFT
  4324.  
  4325.    NET_USE (1, "DOC", .T., 30, "", "")
  4326.    ANNOUNCE_IT()
  4327.    INDEX ON STR(PAGE,2)+STR(SECT,2)+STR(LINE,2) TO DOC
  4328.  
  4329.    NET_USE (1, "SECT", .T., 30, "", "")
  4330.    ANNOUNCE_IT()
  4331.    INDEX ON FM+SF+PAGE+SECT TO SECTFM
  4332.    INDEX ON PAGE+SECT TO SECT
  4333.  
  4334. CASE CHOIX = 5
  4335.    NET_USE (1, "COM", .T., 30, "", "")
  4336.    ANNOUNCE_IT()
  4337.    INDEX ON commande TO COM
  4338.    INDEX ON refcli TO COMCL
  4339.  
  4340. CASE CHOIX = 6
  4341.    NET_USE (1, "FACT", .T., 30, "", "")
  4342.    ANNOUNCE_IT()
  4343.    INDEX ON REFCLI TO FACCL
  4344.    INDEX ON FACTURE+ECH TO FACT
  4345.  
  4346. CASE CHOIX = 7
  4347.    NET_USE (1, "FACTA", .T., 30, "", "")
  4348.    ANNOUNCE_IT()
  4349.    INDEX ON facture+ligne TO FACTR
  4350.  
  4351. CASE CHOIX = 8
  4352.    NET_USE (1, "LITIGE", .T., 30, "", "")
  4353.    ANNOUNCE_IT()
  4354.    INDEX ON CODE TO LITIGE
  4355.    INDEX ON A_DATE TO LITDATE
  4356.    INDEX ON CLIENT TO LITCLI
  4357.    NET_USE (1, "EVENT", .T., 30, "", "")
  4358.    ANNOUNCE_IT()
  4359. *   INDEX ON REFCLI+STR(CTOD('01/01/79')-D_CRE,5) TO EVENT
  4360.    INDEX ON REFCLI+DTOS(D_CRE) TO EVENT DESCENDING
  4361.    INDEX ON BONREF TO EVECODE
  4362.  
  4363. CASE CHOIX = 10
  4364.    NET_USE (1, "PROMOS", .T., 30, "", "")
  4365.    ANNOUNCE_IT()
  4366.    INDEX ON PROMOS->ARTICLE + PROMOS->CLIENT TO PROMOS
  4367.    *
  4368. ENDCASE
  4369.  
  4370. RETURN .T.
  4371. *
  4372. ******************************
  4373. *
  4374. FUNCTION ANNOUNCE_IT
  4375. *
  4376. CLEAR
  4377. @ 5,5 SAY "INDEX FICHIER : " + ALIAS(1)
  4378. RETURN .T.
  4379. //
  4380. //---------------------------------------------------------------------
  4381. //
  4382. ///////////////////////////////////////////////////////////////////////////////
  4383. //
  4384. //  Function-oriented code created by the Xbase++ FormDesigner
  4385. //    Creation date: 14/02/2007 Time: 16:07:40
  4386. //
  4387. ///////////////////////////////////////////////////////////////////////////////
  4388. /*
  4389. #
  4390. */
  4391. #PRAGMA LIBRARY( "ASCOM10.LIB" )
  4392.  
  4393. FUNCTION Window_Cli(Control)
  4394.  
  4395.    LOCAL nEvent, mp1, mp2
  4396.    LOCAL oDlg, oXbp, drawingArea, aEditControls := {}, oXbp1, oXbp2
  4397.    LOCAL oTab1, oTab2, oTab3
  4398.  
  4399.    PUBLIC The_Menu_Bar
  4400.    
  4401.    oDlg := XbpDialog():new( AppDesktop(), , {10,100}, {819,656}, , .F.)
  4402.    oDlg:taskList := .T.
  4403.    oDlg:title := "CLIENT / PROSPECT"
  4404.    oDlg:create()
  4405.  
  4406.    The_Menu_Bar := oDlg:menuBar()     // Set up the Menu system PUBLIC variable   
  4407.    MAIN_MENU()
  4408.  
  4409.    drawingArea := oDlg:drawingArea
  4410.    drawingArea:setFontCompoundName( "8.Arial" )
  4411.  
  4412.    oTab1:= XbpTabPage():new( drawingArea, , {12,48}, {780,516}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE } } )
  4413.    oTab1:caption := "Général"
  4414.    oTab1:minimized := .F.
  4415.    oTab1:tabStop := .T.
  4416.    oTab1:create()
  4417.    oTab1:DropZone := .T.
  4418.    oTab1:TabActivate := ; 
  4419.           {|| oTab2:minimize(), oTab3:minimize(), oTab1:maximize() } 
  4420.  
  4421.    oTab2:= XbpTabPage():new( drawingArea, , {12,48}, {780,516}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE } } )
  4422.    oTab2:caption := "Finance"
  4423.    oTab2:preOffset := 20
  4424.    oTab2:postOffset := 60
  4425.    oTab2:minimized := .T.
  4426.    oTab2:tabStop := .T.
  4427.    oTab2:create()
  4428.    oTab2:TabActivate := ; 
  4429.           {|| oTab1:minimize(), oTab3:minimize(), oTab2:maximize() } 
  4430.  
  4431.    oTab3:= XbpTabPage():new( drawingArea, , {12,48}, {780,516}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE } } )
  4432.    oTab3:caption := "Commentaire"
  4433.    oTab3:minimized := .F.
  4434.    oTab3:preOffset := 40
  4435.    oTab3:postOffset := 40
  4436.    oTab2:minimized := .T.
  4437.    oTab3:tabStop := .T.
  4438.    oTab3:create()
  4439.    oTab3:TabActivate := ; 
  4440.           {|| oTab1:minimize(), oTab2:minimize(),  oTab3:maximize() } 
  4441.  
  4442.    oXbp := XbpPushButton():new( drawingArea, , {252,12}, {84,24},;
  4443.                                 { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
  4444.    oXbp:caption := "Suivant"
  4445.    oXbp:tabStop := .T.
  4446.    oXbp:create()
  4447.    oXbp:activate := {|| Gather( aEditControls ), Pg_Dn(), Scatter ( aEditControls ) }
  4448.  
  4449.    oXbp := XbpPushButton():new( drawingArea, , {156,12}, {84,24},;
  4450.                                 { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
  4451.    oXbp:caption := "Precédant"
  4452.    oXbp:tabStop := .T.
  4453.    oXbp:create()
  4454.    oXbp:activate := {|| Gather( aEditControls ), Pg_Up(), Scatter ( aEditControls ) }
  4455.  
  4456.    oXbp := XbpPushButton():new( drawingArea, , {24,12}, {84,24},;
  4457.                                 { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
  4458.    oXbp:caption := "Annul"
  4459.    oXbp:tabStop := .T.
  4460.    oXbp:create()
  4461.    oXbp:activate := {|| PostAppEvent( xbeP_Close ) }
  4462.  
  4463.    oTab2:minimize()
  4464.    oTab3:minimize()
  4465.    oTab1:maximize()
  4466.  
  4467.    oXbp := XbpSLE():new( oTab1, , {72,456}, {72,24},;
  4468.                 { { XBP_PP_BGCLR, GRA_CLR_CYAN },;
  4469.                   { XBP_PP_DISABLED_BGCLR, GRA_CLR_CYAN } ,;
  4470.                   { XBP_PP_FGCLR, GRA_CLR_BLACK } } )
  4471.    oXbp:bufferLength := 10
  4472.    oXbp:editable := .F.
  4473.    oXbp:tabStop := .T.
  4474.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIREF ), CLIENT->CLIREF := x ) }
  4475.    oXbp:create():setData()
  4476.    AAdd ( aEditControls, oXbp )
  4477.  
  4478.    oXbp := XbpSLE():new( oTab1, , {156,456}, {192,24}, { { XBP_PP_BGCLR, GRA_CLR_CYAN }, { XBP_PP_FGCLR, GRA_CLR_BLACK } } )
  4479.    oXbp:bufferLength := 30
  4480.    oXbp:editable := .T.
  4481.    oXbp:tabStop := .T.
  4482.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLINOM ), CLIENT->CLINOM := x ) }
  4483.    oXbp:create():setData()
  4484.    AAdd ( aEditControls, oXbp )
  4485.  
  4486.    oXbp := XbpSLE():new( oTab1, , {432,456}, {96,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4487.    oXbp:bufferLength := 17
  4488.    oXbp:tabStop := .T.
  4489.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLICONTACT ), CLIENT->CLICONTACT := x ) }
  4490.    oXbp:create():setData()
  4491.    AAdd ( aEditControls, oXbp )
  4492.  
  4493.    oXbp := XbpStatic():new( oTab1, , {372,456}, {48,24} )
  4494.    oXbp:caption := "Contact:"
  4495.    oXbp:clipSiblings := .T.
  4496.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4497.    oXbp:create()
  4498.  
  4499.    oXbp1 := XbpStatic():new( oTab1, , {72,312}, {264,132} )
  4500.    oXbp1:caption := "Addresse"
  4501.    oXbp1:clipSiblings := .T.
  4502.    oXbp1:type := XBPSTATIC_TYPE_GROUPBOX
  4503.    oXbp1:create()
  4504.  
  4505.    oXbp := XbpSLE():new( oXbp1, , {12,84}, {180,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4506.    oXbp:bufferLength := 30
  4507.    oXbp:tabStop := .T.
  4508.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIRUE ), CLIENT->CLIRUE := x ) }
  4509.    oXbp:create():setData()
  4510.    AAdd ( aEditControls, oXbp )
  4511.  
  4512.    oXbp := XbpSLE():new( oXbp1, , {12,48}, {180,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4513.    oXbp:bufferLength := 30
  4514.    oXbp:tabStop := .T.
  4515.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIADS ), CLIENT->CLIADS := x ) }
  4516.    oXbp:create():setData()
  4517.    AAdd ( aEditControls, oXbp )
  4518.  
  4519.    oXbp := XbpSLE():new( oXbp1, , {12,12}, {36,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4520.    oXbp:bufferLength := 5
  4521.    oXbp:tabStop := .T.
  4522.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLICP ), CLIENT->CLICP := x ) }
  4523.    oXbp:create():setData()
  4524.    AAdd ( aEditControls, oXbp )
  4525.  
  4526.    oXbp := XbpSLE():new( oXbp1, , {60,12}, {192,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4527.    oXbp:bufferLength := 30
  4528.    oXbp:tabStop := .T.
  4529.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIVILLE ), CLIENT->CLIVILLE := x ) }
  4530.    oXbp:create():setData()
  4531.    AAdd ( aEditControls, oXbp )
  4532.  
  4533.    oXbp2 := XbpStatic():new( oTab1, , {372,348}, {360,96} )
  4534.    oXbp2:caption := "Téléphone"
  4535.    oXbp2:clipSiblings := .T.
  4536.    oXbp2:type := XBPSTATIC_TYPE_GROUPBOX
  4537.    oXbp2:create()
  4538.  
  4539.    oXbp := XbpStatic():new( oXbp2, , {12,48}, {48,24} )
  4540.    oXbp:caption := "Bureau:"
  4541.    oXbp:clipSiblings := .T.
  4542.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4543.    oXbp:create()
  4544.  
  4545.    oXbp := XbpSLE():new( oXbp2, , {72,48}, {96,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4546.    oXbp:bufferLength := 15
  4547.    oXbp:tabStop := .T.
  4548.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIPHONE ), CLIENT->CLIPHONE := x ) }
  4549.    oXbp:create():setData()
  4550.    AAdd ( aEditControls, oXbp )
  4551.  
  4552.    oXbp := XbpStatic():new( oXbp2, , {180,48}, {48,24} )
  4553.    oXbp:caption := "Dom:"
  4554.    oXbp:clipSiblings := .T.
  4555.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4556.    oXbp:create()
  4557.  
  4558.    oXbp := XbpSLE():new( oXbp2, , {240,48}, {84,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4559.    oXbp:bufferLength := 15
  4560.    oXbp:tabStop := .T.
  4561.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIPHONED ), CLIENT->CLIPHONED := x ) }
  4562.    oXbp:create():setData()
  4563.    AAdd ( aEditControls, oXbp )
  4564.  
  4565.    oXbp := XbpStatic():new( oXbp2, , {12,12}, {48,24} )
  4566.    oXbp:caption := "Portable:"
  4567.    oXbp:clipSiblings := .T.
  4568.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4569.    oXbp:create()
  4570.  
  4571.    oXbp := XbpSLE():new( oXbp2, , {72,12}, {96,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4572.    oXbp:bufferLength := 15
  4573.    oXbp:tabStop := .T.
  4574.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIPHONEV ), CLIENT->CLIPHONEV := x ) }
  4575.    oXbp:create():setData()
  4576.    AAdd ( aEditControls, oXbp )
  4577.  
  4578.    oXbp := XbpStatic():new( oXbp2, , {180,12}, {48,24} )
  4579.    oXbp:caption := "Fax:"
  4580.    oXbp:clipSiblings := .T.
  4581.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4582.    oXbp:create()
  4583.  
  4584.    oXbp := XbpSLE():new( oXbp2, , {240,12}, {108,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4585.    oXbp:bufferLength := 15
  4586.    oXbp:tabStop := .T.
  4587.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIFAX ), CLIENT->CLIFAX := x ) }
  4588.    oXbp:create():setData()
  4589.    AAdd ( aEditControls, oXbp )
  4590.  
  4591.    oXbp := XbpStatic():new( oTab1, , {384,300}, {48,24} )
  4592.    oXbp:caption := "Activité:"
  4593.    oXbp:clipSiblings := .T.
  4594.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4595.    oXbp:create()
  4596.  
  4597.    oXbp := XbpSLE():new( oTab1, , {432,300}, {36,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4598.    oXbp:bufferLength := 4
  4599.    oXbp:tabStop := .T.
  4600.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIPROFESS ), CLIENT->CLIPROFESS := x ) }
  4601.    oXbp:create():setData()
  4602.    AAdd ( aEditControls, oXbp )
  4603.  
  4604.    oXbp := XbpStatic():new( oTab1, , {72,264}, {84,24} )
  4605.    oXbp:caption := "Dernière Visite:"
  4606.    oXbp:clipSiblings := .T.
  4607.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4608.    oXbp:create()
  4609.  
  4610.    oXbp := XbpSLE():new( oTab1, , {156,264}, {60,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4611.    oXbp:bufferLength := 8
  4612.    oXbp:tabStop := .T.
  4613.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, DtoC( CLIENT->DERNVISIT ), CLIENT->DERNVISIT := CtoD(x) ) }
  4614.    oXbp:create():setData()
  4615.    AAdd ( aEditControls, oXbp )
  4616.  
  4617.    oXbp := XbpStatic():new( oTab1, , {240,264}, {84,24} )
  4618.    oXbp:caption := "Action avant le :"
  4619.    oXbp:clipSiblings := .T.
  4620.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4621.    oXbp:create()
  4622.  
  4623.    oXbp := XbpSLE():new( oTab1, , {324,264}, {60,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4624.    oXbp:bufferLength := 8
  4625.    oXbp:tabStop := .T.
  4626.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, DtoC( CLIENT->RELANCE ), CLIENT->RELANCE := CtoD(x) ) }
  4627.    oXbp:create():setData()
  4628.    AAdd ( aEditControls, oXbp )
  4629.  
  4630.    oXbp := XbpStatic():new( oTab1, , {480,300}, {36,24} )
  4631.    oXbp:caption := "Taille:"
  4632.    oXbp:clipSiblings := .T.
  4633.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4634.    oXbp:create()
  4635.  
  4636.    oXbp := XbpSLE():new( oTab1, , {516,300}, {36,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4637.    oXbp:bufferLength := 4
  4638.    oXbp:tabStop := .T.
  4639.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLITAILLE ), CLIENT->CLITAILLE := x ) }
  4640.    oXbp:create():setData()
  4641.    AAdd ( aEditControls, oXbp )
  4642.  
  4643.    oXbp := XbpStatic():new( oTab1, , {564,300}, {96,24} )
  4644.    oXbp:caption := "Créa&tion (MMYY):"
  4645.    oXbp:clipSiblings := .T.
  4646.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4647.    oXbp:create()
  4648.  
  4649.    oXbp := XbpSLE():new( oTab1, , {660,300}, {60,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4650.    oXbp:bufferLength := 4
  4651.    oXbp:tabStop := .T.
  4652.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->DATE_CRE, '@N' ), CLIENT->DATE_CRE := Val(x) ) }
  4653.    oXbp:create():setData()
  4654.    AAdd ( aEditControls, oXbp )
  4655.  
  4656.    oXbp := XbpMLE():new( oTab1, , {84,168}, {648,84}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4657.    oXbp:tabStop := .T.
  4658.    oXbp:create()
  4659.  
  4660. //
  4661. //----------------------------------------------------------------------
  4662. //
  4663. //  FINANCE PAGE
  4664.  
  4665.  
  4666.    oXbp := XbpSLE():new( oTab2, , {72,456}, {72,24},;
  4667.                 { { XBP_PP_BGCLR, GRA_CLR_CYAN },;
  4668.                   { XBP_PP_DISABLED_BGCLR, GRA_CLR_CYAN } ,;
  4669.                   { XBP_PP_FGCLR, GRA_CLR_BLACK } } )
  4670.    oXbp:bufferLength := 10
  4671.    oXbp:editable := .F.
  4672.    oXbp:tabStop := .T.
  4673.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIREF ), CLIENT->CLIREF := x ) }
  4674.    oXbp:create():setData()
  4675.    AAdd ( aEditControls, oXbp )
  4676.  
  4677.    oXbp := XbpSLE():new( oTab2, , {156,456}, {192,24}, { { XBP_PP_BGCLR, GRA_CLR_CYAN }, { XBP_PP_FGCLR, GRA_CLR_BLACK } } )
  4678.    oXbp:bufferLength := 30
  4679.    oXbp:editable := .T.
  4680.    oXbp:tabStop := .T.
  4681.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLINOM ), CLIENT->CLINOM := x ) }
  4682.    oXbp:create():setData()
  4683.    AAdd ( aEditControls, oXbp )
  4684.  
  4685.    oXbp := XbpStatic():new( oTab2, , {432,456}, {36,24} )
  4686.    oXbp:caption := "Siret :"
  4687.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4688.    oXbp:create()
  4689.  
  4690.    oXbp := XbpSLE():new( oTab2, , {480,456}, {84,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4691.    oXbp:bufferLength := 14
  4692.    oXbp:tabStop := .T.
  4693.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLISIRET ), CLIENT->CLISIRET := x ) }
  4694.    oXbp:create():setData()
  4695.    AAdd ( aEditControls, oXbp )
  4696.  
  4697.    oXbp1 := XbpStatic():new( oTab2, , {72,384}, {420,60} )
  4698.    oXbp1:caption := "Banque"
  4699.    oXbp1:clipSiblings := .T.
  4700.    oXbp1:type := XBPSTATIC_TYPE_GROUPBOX
  4701.    oXbp1:create()
  4702.  
  4703.    oXbp := XbpSLE():new( oXbp1, , {12,12}, {84,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4704.    oXbp:bufferLength := 24
  4705.    oXbp:tabStop := .T.
  4706.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIBANK ), CLIENT->CLIBANK := x ) }
  4707.    oXbp:create():setData()
  4708.    AAdd ( aEditControls, oXbp )
  4709.  
  4710.    oXbp := XbpSLE():new( oXbp1, , {96,12}, {120,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4711.    oXbp:bufferLength := 24
  4712.    oXbp:tabStop := .T.
  4713.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIBANKADS ), CLIENT->CLIBANKADS := x ) }
  4714.    oXbp:create():setData()
  4715.    AAdd ( aEditControls, oXbp )
  4716.  
  4717.    oXbp := XbpSLE():new( oXbp1, , {240,12}, {36,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4718.    oXbp:bufferLength := 5
  4719.    oXbp:tabStop := .T.
  4720.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIBCODE ), CLIENT->CLIBCODE := x ) }
  4721.    oXbp:create():setData()
  4722.    AAdd ( aEditControls, oXbp )
  4723.  
  4724.    oXbp := XbpSLE():new( oXbp1, , {276,12}, {36,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4725.    oXbp:bufferLength := 5
  4726.    oXbp:tabStop := .T.
  4727.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIBCGUI ), CLIENT->CLIBCGUI := x ) }
  4728.    oXbp:create():setData()
  4729.    AAdd ( aEditControls, oXbp )
  4730.  
  4731.    oXbp := XbpSLE():new( oXbp1, , {312,12}, {72,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4732.    oXbp:bufferLength := 11
  4733.    oXbp:tabStop := .T.
  4734.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIBNCPT ), CLIENT->CLIBNCPT := x ) }
  4735.    oXbp:create():setData()
  4736.    AAdd ( aEditControls, oXbp )
  4737.  
  4738.    oXbp := XbpSLE():new( oXbp1, , {384,12}, {24,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4739.    oXbp:bufferLength := 2
  4740.    oXbp:tabStop := .T.
  4741.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIBRIB ), CLIENT->CLIBRIB := x ) }
  4742.    oXbp:create():setData()
  4743.    AAdd ( aEditControls, oXbp )
  4744.  
  4745.    oXbp2 := XbpStatic():new( oTab2, , {288,132}, {276,228} )
  4746.    oXbp2:caption := "EQUIVALENT CONCURRENT                      Quantité"
  4747.    oXbp2:clipSiblings := .T.
  4748.    oXbp2:type := XBPSTATIC_TYPE_GROUPBOX
  4749.    oXbp2:create()
  4750.  
  4751.    oXbp := XbpSLE():new( oXbp2, , {12,180}, {192,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4752.    oXbp:bufferLength := 12
  4753.    oXbp:tabStop := .T.
  4754.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->QL_1 ), CLIENT->QL_1 := x ) }
  4755.    oXbp:create():setData()
  4756.    AAdd ( aEditControls, oXbp )
  4757.  
  4758.    oXbp := XbpSLE():new( oXbp2, , {12,156}, {192,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4759.    oXbp:bufferLength := 12
  4760.    oXbp:tabStop := .T.
  4761.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->QL_2 ), CLIENT->QL_2 := x ) }
  4762.    oXbp:create():setData()
  4763.    AAdd ( aEditControls, oXbp )
  4764.  
  4765.    oXbp := XbpSLE():new( oXbp2, , {12,132}, {192,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4766.    oXbp:bufferLength := 12
  4767.    oXbp:tabStop := .T.
  4768.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->QL_3 ), CLIENT->QL_3 := x ) }
  4769.    oXbp:create():setData()
  4770.    AAdd ( aEditControls, oXbp )
  4771.  
  4772.    oXbp := XbpSLE():new( oXbp2, , {12,108}, {192,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4773.    oXbp:bufferLength := 12
  4774.    oXbp:tabStop := .T.
  4775.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->QL_4 ), CLIENT->QL_4 := x ) }
  4776.    oXbp:create():setData()
  4777.    AAdd ( aEditControls, oXbp )
  4778.  
  4779.    oXbp := XbpSLE():new( oXbp2, , {12,84}, {192,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4780.    oXbp:bufferLength := 12
  4781.    oXbp:tabStop := .T.
  4782.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->QL_5 ), CLIENT->QL_5 := x ) }
  4783.    oXbp:create():setData()
  4784.    AAdd ( aEditControls, oXbp )
  4785.  
  4786.    oXbp := XbpSLE():new( oXbp2, , {12,60}, {192,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4787.    oXbp:bufferLength := 12
  4788.    oXbp:tabStop := .T.
  4789.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->QL_6 ), CLIENT->QL_6 := x ) }
  4790.    oXbp:create():setData()
  4791.    AAdd ( aEditControls, oXbp )
  4792.  
  4793.    oXbp := XbpSLE():new( oXbp2, , {12,36}, {192,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4794.    oXbp:bufferLength := 12
  4795.    oXbp:tabStop := .T.
  4796.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->QL_7 ), CLIENT->QL_7 := x ) }
  4797.    oXbp:create():setData()
  4798.    AAdd ( aEditControls, oXbp )
  4799.  
  4800.    oXbp := XbpSLE():new( oXbp2, , {12,12}, {192,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4801.    oXbp:bufferLength := 12
  4802.    oXbp:tabStop := .T.
  4803.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->QL_8 ), CLIENT->QL_8 := x ) }
  4804.    oXbp:create():setData()
  4805.    AAdd ( aEditControls, oXbp )
  4806.  
  4807.    oXbp := XbpSLE():new( oXbp2, , {216,180}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4808.    oXbp:bufferLength := 6
  4809.    oXbp:tabStop := .T.
  4810.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->QC_1, '@N' ), CLIENT->QC_1 := Val(x) ) }
  4811.    oXbp:create():setData()
  4812.    AAdd ( aEditControls, oXbp )
  4813.  
  4814.    oXbp := XbpSLE():new( oXbp2, , {216,156}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4815.    oXbp:bufferLength := 6
  4816.    oXbp:tabStop := .T.
  4817.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->QC_2, '@N' ), CLIENT->QC_2 := Val(x) ) }
  4818.    oXbp:create():setData()
  4819.    AAdd ( aEditControls, oXbp )
  4820.  
  4821.    oXbp := XbpSLE():new( oXbp2, , {216,132}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4822.    oXbp:bufferLength := 6
  4823.    oXbp:tabStop := .T.
  4824.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->QC_3, '@N' ), CLIENT->QC_3 := Val(x) ) }
  4825.    oXbp:create():setData()
  4826.    AAdd ( aEditControls, oXbp )
  4827.  
  4828.    oXbp := XbpSLE():new( oXbp2, , {216,108}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4829.    oXbp:bufferLength := 6
  4830.    oXbp:tabStop := .T.
  4831.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->QC_4, '@N' ), CLIENT->QC_4 := Val(x) ) }
  4832.    oXbp:create():setData()
  4833.    AAdd ( aEditControls, oXbp )
  4834.  
  4835.    oXbp := XbpSLE():new( oXbp2, , {216,84}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4836.    oXbp:bufferLength := 6
  4837.    oXbp:tabStop := .T.
  4838.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->QC_5, '@N' ), CLIENT->QC_5 := Val(x) ) }
  4839.    oXbp:create():setData()
  4840.    AAdd ( aEditControls, oXbp )
  4841.  
  4842.    oXbp := XbpSLE():new( oXbp2, , {216,60}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4843.    oXbp:bufferLength := 6
  4844.    oXbp:tabStop := .T.
  4845.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->QC_6, '@N' ), CLIENT->QC_6 := Val(x) ) }
  4846.    oXbp:create():setData()
  4847.    AAdd ( aEditControls, oXbp )
  4848.  
  4849.    oXbp := XbpSLE():new( oXbp2, , {216,36}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4850.    oXbp:bufferLength := 6
  4851.    oXbp:tabStop := .T.
  4852.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->QC_7, '@N' ), CLIENT->QC_7 := Val(x) ) }
  4853.    oXbp:create():setData()
  4854.    AAdd ( aEditControls, oXbp )
  4855.  
  4856.    oXbp := XbpSLE():new( oXbp2, , {216,12}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4857.    oXbp:bufferLength := 6
  4858.    oXbp:tabStop := .T.
  4859.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->QC_8, '@N' ), CLIENT->QC_8 := Val(x) ) }
  4860.    oXbp:create():setData()
  4861.    AAdd ( aEditControls, oXbp )
  4862.  
  4863.    oXbp3 := XbpStatic():new( oTab2, , {72,132}, {168,228} )
  4864.    oXbp3:caption := "MATERIEL MEFRAN    Quantité"
  4865.    oXbp3:clipSiblings := .T.
  4866.    oXbp3:type := XBPSTATIC_TYPE_GROUPBOX
  4867.    oXbp3:create()
  4868.  
  4869.    oXbp := XbpStatic():new( oXbp3, , {12,180}, {84,24} )
  4870.    oXbp:caption := "49-900"
  4871.    oXbp:clipSiblings := .T.
  4872.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4873.    oXbp:create()
  4874.  
  4875.    oXbp := XbpStatic():new( oXbp3, , {12,156}, {84,24} )
  4876.    oXbp:caption := "SECURIFRAN"
  4877.    oXbp:clipSiblings := .T.
  4878.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4879.    oXbp:create()
  4880.  
  4881.    oXbp := XbpStatic():new( oXbp3, , {12,132}, {84,24} )
  4882.    oXbp:caption := "42-700"
  4883.    oXbp:clipSiblings := .T.
  4884.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4885.    oXbp:create()
  4886.  
  4887.    oXbp := XbpStatic():new( oXbp3, , {12,108}, {84,24} )
  4888.    oXbp:caption := "ROULANTS"
  4889.    oXbp:clipSiblings := .T.
  4890.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4891.    oXbp:create()
  4892.  
  4893.    oXbp := XbpStatic():new( oXbp3, , {12,84}, {84,24} )
  4894.    oXbp:caption := "CH49/AUTO."
  4895.    oXbp:clipSiblings := .T.
  4896.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4897.    oXbp:create()
  4898.  
  4899.    oXbp := XbpStatic():new( oXbp3, , {12,60}, {84,24} )
  4900.    oXbp:caption := "PLANCHERS"
  4901.    oXbp:clipSiblings := .T.
  4902.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4903.    oXbp:create()
  4904.  
  4905.    oXbp := XbpStatic():new( oXbp3, , {12,36}, {84,24} )
  4906.    oXbp:caption := "DIFFUSION"
  4907.    oXbp:clipSiblings := .T.
  4908.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4909.    oXbp:create()
  4910.  
  4911.    oXbp := XbpStatic():new( oXbp3, , {12,12}, {84,24} )
  4912.    oXbp:caption := "DIVERS"
  4913.    oXbp:clipSiblings := .T.
  4914.    oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
  4915.    oXbp:create()
  4916.  
  4917.    oXbp := XbpSLE():new( oXbp3, , {108,12}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4918.    oXbp:bufferLength := 6
  4919.    oXbp:tabStop := .T.
  4920.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->Q_8, '@N' ), CLIENT->Q_8 := Val(x) ) }
  4921.    oXbp:create():setData()
  4922.    AAdd ( aEditControls, oXbp )
  4923.  
  4924.    oXbp := XbpSLE():new( oXbp3, , {108,36}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4925.    oXbp:bufferLength := 6
  4926.    oXbp:tabStop := .T.
  4927.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->Q_7, '@N' ), CLIENT->Q_7 := Val(x) ) }
  4928.    oXbp:create():setData()
  4929.    AAdd ( aEditControls, oXbp )
  4930.  
  4931.    oXbp := XbpSLE():new( oXbp3, , {108,60}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4932.    oXbp:bufferLength := 6
  4933.    oXbp:tabStop := .T.
  4934.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->Q_6, '@N' ), CLIENT->Q_6 := Val(x) ) }
  4935.    oXbp:create():setData()
  4936.    AAdd ( aEditControls, oXbp )
  4937.  
  4938.    oXbp := XbpSLE():new( oXbp3, , {108,84}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4939.    oXbp:bufferLength := 6
  4940.    oXbp:tabStop := .T.
  4941.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->Q_5, '@N' ), CLIENT->Q_5 := Val(x) ) }
  4942.    oXbp:create():setData()
  4943.    AAdd ( aEditControls, oXbp )
  4944.  
  4945.    oXbp := XbpSLE():new( oXbp3, , {108,108}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4946.    oXbp:bufferLength := 6
  4947.    oXbp:tabStop := .T.
  4948.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->Q_4, '@N' ), CLIENT->Q_4 := Val(x) ) }
  4949.    oXbp:create():setData()
  4950.    AAdd ( aEditControls, oXbp )
  4951.  
  4952.    oXbp := XbpSLE():new( oXbp3, , {108,132}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4953.    oXbp:bufferLength := 6
  4954.    oXbp:tabStop := .T.
  4955.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->Q_3, '@N' ), CLIENT->Q_3 := Val(x) ) }
  4956.    oXbp:create():setData()
  4957.    AAdd ( aEditControls, oXbp )
  4958.  
  4959.    oXbp := XbpSLE():new( oXbp3, , {108,156}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4960.    oXbp:bufferLength := 6
  4961.    oXbp:tabStop := .T.
  4962.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->Q_2, '@N' ), CLIENT->Q_2 := Val(x) ) }
  4963.    oXbp:create():setData()
  4964.    AAdd ( aEditControls, oXbp )
  4965.  
  4966.    oXbp := XbpSLE():new( oXbp3, , {108,180}, {48,24}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  4967.    oXbp:bufferLength := 6
  4968.    oXbp:tabStop := .T.
  4969.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Transform( CLIENT->Q_1, '@N' ), CLIENT->Q_1 := Val(x) ) }
  4970.    oXbp:create():setData()
  4971.    AAdd ( aEditControls, oXbp )
  4972.  
  4973.  
  4974.  
  4975. //
  4976. //----------------------------------------------------------------------
  4977. //
  4978. //  COMMENT PAGE
  4979.  
  4980.  
  4981.    oXbp := XbpSLE():new( oTab3, , {72,456}, {72,24},;
  4982.                 { { XBP_PP_BGCLR, GRA_CLR_CYAN },;
  4983.                   { XBP_PP_DISABLED_BGCLR, GRA_CLR_CYAN } ,;
  4984.                   { XBP_PP_FGCLR, GRA_CLR_BLACK } } )
  4985.    oXbp:bufferLength := 10
  4986.    oXbp:editable := .F.
  4987.    oXbp:tabStop := .T.
  4988.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLIREF ), CLIENT->CLIREF := x ) }
  4989.    oXbp:create():setData()
  4990.    AAdd ( aEditControls, oXbp )
  4991.  
  4992.    oXbp := XbpSLE():new( oTab3, , {156,456}, {192,24}, { { XBP_PP_BGCLR, GRA_CLR_CYAN }, { XBP_PP_FGCLR, GRA_CLR_BLACK } } )
  4993.    oXbp:bufferLength := 30
  4994.    oXbp:editable := .T.
  4995.    oXbp:tabStop := .T.
  4996.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( CLIENT->CLINOM ), CLIENT->CLINOM := x ) }
  4997.    oXbp:create():setData()
  4998.    AAdd ( aEditControls, oXbp )
  4999.  
  5000.    oXbp := XbpMle():new( oTab3, , {84,68}, {588,328}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
  5001.    oXbp:wordWrap :=.T.
  5002.    oXbp:horizScroll := .F.
  5003.    oXbp:editable:=.T.    
  5004.    oXbp:setFontCompoundName( "10.Arial" )
  5005.    oXbp:tabStop := .T.
  5006.    oXbp:dataLink := {|x| IIf( PCOUNT()==0, CLIENT->COMMENTAIR, CLIENT->COMMENTAIR := x ) }
  5007.    oXbp:create():setData()
  5008.    AAdd ( aEditControls, oXbp )
  5009.  
  5010.    oDlg:show()
  5011.    SetAppFocus(oDlg)
  5012.  
  5013.    nEvent := xbe_None
  5014.    DO WHILE nEvent <> xbeP_Close
  5015.       nEvent := AppEvent( @mp1, @mp2, @oXbp )
  5016.       oXbp:handleEvent( nEvent, mp1, mp2 )
  5017.    ENDDO
  5018.    oDlg:hide()
  5019.    oDlg:destroy()
  5020. RETURN .T.
  5021.  
  5022. //
  5023. //--------------------------------------------------------
  5024. //
  5025. FUNCTION MAIN_MENU ()
  5026.  
  5027.  
  5028. LOCAL LL, CHOICE, cSaveScrn, PromptList
  5029. LOCAL The_Prompts :=  {}, SM := {}, The_Codes :=  {}
  5030.  
  5031. The_Prompts :=  { ;
  5032.                 "MENU",;
  5033.                     {"Historique",           {||Dispatcher ("MH")},; 
  5034.                      "@",, ;
  5035.                      "Impression",           {||Dispatcher ("IM")},;
  5036.                      "@",, ;
  5037.                      "Saisie Commande",      {||Dispatcher ("CC")},;
  5038.                      "Modification Commande",{||Dispatcher ("CM")},;
  5039.                      "Commandes en cours",   {||Dispatcher ("EC")},;
  5040.                      "@",, ;
  5041.                      "Suppression",          {||Dispatcher ("S")},;
  5042.                      "@",, ;
  5043.                      "Catalogue",            {||Dispatcher ("SM")},;
  5044.                      "@",, ;
  5045.                      "RETOUR",               {||QUIT_IT()}   },;
  5046.                 "?",;
  5047.                     {"Général",      {||HELP_ME("01")},;
  5048.                      "Recherche",    {||HELP_ME("02")},;
  5049.                      "Catégories",   {||HELP_ME("03")} };
  5050.                   }
  5051.                       
  5052.    CREATE_MENU (The_Prompts)
  5053.    RETURN .T.
  5054. //
  5055. //----------------------------------------------------------
  5056. //
  5057. FUNCTION QUIT_IT()
  5058.  
  5059. PostAppEvent (xbeP_Close)
  5060.  
  5061. RETURN .T.
  5062. //
  5063. //-----------------------------------------------------------------------------------------------
  5064. //
  5065. FUNCTION CREATE_MENU(The_Choices)
  5066. LOCAL i, j, oMenu, Menu_Items, oSubMenu, SM, k
  5067.  
  5068. FOR i = 1 TO LEN (The_Choices) STEP 2
  5069.  
  5070.    oMenu    := XbpMenu():new( The_Menu_Bar )  // New MENU object
  5071.    oMenu:title := The_Choices[i]              // Menu Name 
  5072.    oMenu:setName(i * 100)                     // Code for this menu   
  5073.    oMenu:create()
  5074.  
  5075.    Menu_Items = The_Choices[i+1]
  5076.    FOR j = 1 TO LEN (Menu_Items) -1 STEP 2
  5077.       IF ValType (Menu_Items [j]) = "A"
  5078.       
  5079.          SM = Menu_Items [j]
  5080.          oSubMenu       := XbpMenu():new( oMenu )
  5081.          oSubMenu:title := SM[1]   
  5082.          oSubMenu:create()
  5083.  
  5084.          SM = SM[2]
  5085.          FOR k = 1 TO LEN(SM)-1 STEP 2
  5086.             IF (SM [k]) = "@"
  5087.                oSubMenu:addItem( {NIL, NIL, XBPMENUBAR_MIS_SEPARATOR, 0} )
  5088.             ELSE
  5089.                oSubMenu:addItem( { SM[k], SM[k+1] } )
  5090.             ENDIF   
  5091.          NEXT k
  5092.          
  5093.          oMenu:addItem( { oSubMenu, NIL } )
  5094.  
  5095.       ELSEIF (Menu_Items [j]) = "@"
  5096.          oMenu:addItem( {NIL, NIL, XBPMENUBAR_MIS_SEPARATOR, 0} )
  5097.       ELSE
  5098.          oMenu:addItem( {Menu_Items [j] , Menu_Items [j+1]},  )   
  5099.       ENDIF   
  5100.    NEXT j
  5101.  
  5102.    The_Menu_Bar:addItem( {oMenu, NIL} )     // Create the Menu
  5103.  
  5104. NEXT i
  5105.  
  5106. RETURN .T.
  5107. //
  5108. //-----------------------------------------------------
  5109. //
  5110. FUNCTION Dispatcher (Control)
  5111.  
  5112.  
  5113. Menu_On_Off (.F.)             // disable other menu choices
  5114. The_Menu_Bar:enableItem(The_Menu_Bar:numItems())    // Except HELP
  5115.  
  5116. DO CASE
  5117.    CASE Control = "MH"   // Historique
  5118.       DO EV  
  5119.          
  5120.    CASE Control = "IM"   // Impression
  5121.       Imp_FICHE()  
  5122.       
  5123.    CASE Control = "CC"   // Saisie Commande
  5124.       SET CURSOR ON
  5125.       DO S_COMM WITH "1"
  5126.       
  5127.    CASE Control = "CM"   // Modif. Cde  
  5128.       i=1     
  5129.          
  5130.    CASE Control = "EC"   // Cdes en Cours 
  5131.       DO CC     
  5132.       
  5133.    CASE Control = "S"    // Suppression
  5134.       i=1     
  5135.       
  5136.    CASE Control = "SM"   // Stock
  5137.      DO ST WITH 4
  5138.       
  5139.    
  5140. ENDCASE
  5141.  
  5142. Menu_On_Off (.T.)             // enable menu choices
  5143. RETURN .T.
  5144. //
  5145. //-----------------------------------------------------------------------------------------------
  5146. //
  5147.  
  5148. FUNCTION Menu_On_Off(CONTROL)
  5149. LOCAL oMenu ,I,J
  5150.  
  5151. FOR i = 1 TO The_Menu_Bar:numItems()      // Number of main menu items
  5152.    IF Control
  5153.       The_Menu_Bar:enableItem( i ) 
  5154.    ELSE
  5155.       The_Menu_Bar:disableItem( i ) 
  5156.    ENDIF   
  5157. NEXT 
  5158. RETURN .T.
  5159.  
  5160. //
  5161. //-----------------------------------------------------------------------------------------------
  5162. //
  5163. //
  5164. //////////////////////////////////////////////////////////////////////
  5165. //
  5166. //  APPSYS.PRG
  5167. //
  5168. //  Copyright:
  5169. //      Alaska Software, (c) 1997-2002. All rights reserved.         
  5170. //  
  5171. //  Contents:
  5172. //      AppSys() - Creates default application window
  5173. //   
  5174. //  Remarks:
  5175. //      This file is part of the XppRt0.lib.
  5176. //   
  5177. //  Syntax:
  5178. //      The function AppSys() is called automatically during 
  5179. //      the programm startup.
  5180. //   
  5181. //////////////////////////////////////////////////////////////////////
  5182.  
  5183. #include "xbp.ch"
  5184.  
  5185. ****************************************************************************
  5186. * Function AppSys() to create default output devices
  5187. ****************************************************************************
  5188.  
  5189. FUNCTION AppSys()
  5190.  
  5191. #define DEF_ROWS       30
  5192. #define DEF_COLS       80
  5193.  
  5194. LOCAL oCrt, nAppType := AppType()
  5195. LOCAL aSizeDesktop, aPos
  5196. LOCAL DEF_FONTHEIGHT:= 16
  5197. LOCAL DEF_FONTWIDTH:=  8
  5198.  
  5199. PUBLIC aWindow[3], The_Menu_Bar
  5200.  
  5201. // Compute window position (center window 
  5202. // on the Desktop)
  5203. aSizeDesktop    := AppDesktop():currentSize()
  5204.  
  5205. *IF aSizeDesktop[1] > 800
  5206. *   DEF_FONTHEIGHT:= 22
  5207. *   DEF_FONTWIDTH:=  12
  5208. *ENDIF          
  5209.  
  5210. aPos            := { (aSizeDesktop[1]-(DEF_COLS * DEF_FONTWIDTH))  /2, ;
  5211.                      (aSizeDesktop[2]-(DEF_ROWS * DEF_FONTHEIGHT)) /2  }
  5212.  
  5213. // Create XbpCRT object
  5214. oCrt := XbpCrt():New ( NIL, NIL, aPos, DEF_ROWS, DEF_COLS )
  5215. oCrt:FontWidth  := DEF_FONTWIDTH
  5216. oCrt:FontHeight := DEF_FONTHEIGHT
  5217. oCrt:title      := "ALTRAD EQUIPEMENT - CLIENTS"
  5218.  
  5219. IF aSizeDesktop[1] <= 800
  5220.    oCrt:FontName   := "Alaska Crt"
  5221. ELSE 
  5222.    oCrt:FontName   := "Lucida Console"
  5223. ENDIF   
  5224.  
  5225. oCrt:Create()
  5226. aWindow[1] := oCrt
  5227. *The_Menu_Bar := oCrt:menuBar()     // Set up the Menu system PUBLIC variable
  5228. *MAIN_MENU () 
  5229.  
  5230. oCrt:setpos(apos) 
  5231.  
  5232. // Init Presentation Space
  5233. oCrt:PresSpace()
  5234.  
  5235. // XbpCrt gets active window and output device
  5236. SetAppWindow ( oCrt )
  5237. SETCOLOR ("n/w")
  5238. CLEAR
  5239.  
  5240.  
  5241. //
  5242. // Help Window
  5243. //
  5244. aWindow[2] := XbpCrt():new(AppDesktop(), NIL, {50, 100}, 24, 80, "ASSISTANCE" ) 
  5245. aWindow[2]:FontWidth  := 8
  5246. aWindow[2]:FontHeight := 16
  5247. aWindow[2]:create() 
  5248. aWindow[2]:setModalState (XBP_DISP_APPMODAL)
  5249. aWindow[2]:PresSpace()
  5250.  
  5251. SetAppWindow( aWindow[2] )
  5252. SETCOLOR ('n/w,r/w')
  5253. CLS
  5254. aWindow[2]:hide()
  5255. //
  5256. // Mot_Clé window
  5257. //
  5258. aWindow[3] := XbpCrt():new(AppDesktop(), NIL, {50, 100}, 5, 20, "" ) 
  5259. aWindow[3]:FontWidth  := DEF_FONTWIDTH
  5260. aWindow[3]:FontHeight := DEF_FONTHEIGHT
  5261. aWindow[3]:Border := XBPDLG_NO_BORDER
  5262. aWindow[3]:Closeable := .F.
  5263. aWindow[3]:titleBar := .F.    
  5264. aWindow[3]:FontName   := "Arial"
  5265. aWindow[3]:create() 
  5266. aWindow[3]:PresSpace()
  5267. SetAppWindow( aWindow[3] )
  5268. SETCOLOR ('n/w,r/w')
  5269. CLS
  5270. aWindow[3]:hide()
  5271.  
  5272. SetAppWindow ( oCrt )
  5273. oBMP2:= XbpBitmap():new():create( oCrt )  // Logo for display
  5274. oBMP2:loadfile( "LOGO2.BMP" )
  5275. oBMP2:draw( NIL, {100 ,100} )             // Draw the logo
  5276. SetAppFocus(oCrt)
  5277.  
  5278. RETURN .T.
  5279.  
  5280.  
  5281.  
  5282.  
  5283.  
  5284.  
  5285.  
  5286.