Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <Date.au3>
#include <GuiListView.au3>
Global $stockini = @ScriptDir & "\stock.ini"
Global $Datedebut, $Dateretour, $Calc, $Rev1
If not FileExists($stockini) Then _BuildIni()
Global $stockdispo = _StockDispo(_NowDate()) ; dispo aujourd'hui
Global $nbObj = $stockdispo[0][0]
;_ArrayDisplay($stockdispo)
$gui = GUICreate("Form1", 840, 250, 199, 127)
GUICtrlCreateLabel("Date depart", 15, 13, 60, 20)
$Datedebut = GUICtrlCreateDate("", 80, 10, 170, 20)
GUICtrlCreateLabel("Date retour", 270, 13, 60, 20)
$Dateretour = GUICtrlCreateDate("", 330, 10, 170, 20)
GUICtrlCreateLabel("Nom de la location", 530, 13, 90, 20)
$Inputnom = GUICtrlCreateInput("", 630, 10, 180, 20)
$listview = GUICtrlCreateListView("désignation| en stock|prix|stock|", 10, 50, 400, 130)
_GUICtrlListView_JustifyColumn($listView, 2, 1)
GUICtrlSendMsg($listview, $LVM_SETCOLUMNWIDTH, 0, 100)
;GUICtrlSendMsg($listview, $LVM_SETCOLUMNWIDTH, 20, 200)
$modifstock_btn = GUICtrlCreateButton("modifier le stock", 20, 190, 120, 25)
$listview1 = GUICtrlCreateListView("désignation|prix ht|TVA %|quantité|Prix total ", 430, 50, 400, 130)
_GUICtrlListView_JustifyColumn($listView1, 4, 1)
GUICtrlSendMsg($listview1, $LVM_SETCOLUMNWIDTH, 0, 100)
$menu = GUICtrlCreateContextMenu($listview1)
$menuSuppr = GUICtrlCreateMenuItem("Supprimer", $menu)
$btn_ajout = GUICtrlCreateButton("ajouter à la location", 430, 190, 120, 25)
$btn_reg = GUICtrlCreateButton("enregistrer la location", 555, 190, 130, 25)
GUICtrlCreateLabel("total", 710, 195, 40, 20)
$total = GUICtrlCreateInput("", 745, 190, 80, 20)
Dim $lignetab1[$nbObj]
For $i = 1 to $nbObj
$item_prix = IniRead($stockini, "prix", $stockdispo[$i][0], "")
$lignetab1[$i-1] = GUICtrlCreateListViewItem($stockdispo[$i][0] & "|" & _
$stockdispo[$i][1] & "|" & StringFormat("%.2f", $item_prix), $listview)
Next
GUISetState()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $modifstock_btn
$stock = IniReadSection($stockini, "stock_init")
$modif_gui = GuiCreate("modif stock", 250, 120)
$modif_LV = GUICtrlCreateListView("objets", 10, 10, 120, 100)
GUICtrlSendMsg($modif_LV, $LVM_SETCOLUMNWIDTH, 0, 90)
For $i = 1 to $nbObj
GUICtrlCreateListViewItem($stock[$i][0], $modif_LV)
Next
GuiCtrlCreateLabel("en stock", 150, 33, 50, 18)
$input_nb = GUICtrlCreateInput("", 200, 30, 35, 20, 1)
$btn_ok = GUICtrlCreateButton("enregistrer", 150, 70, 85, 25)
GuiSetState()
$item = -1
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
GuiDelete($modif_gui)
Exitloop
Case $GUI_EVENT_PRIMARYDOWN
$a = GuiGetCursorInfo($modif_gui)
If $a[4] = $modif_LV Then
$item = GetItemClicked(GuiCtrlGetHandle($modif_LV))
If $item = -1 Then GuiCtrlSetData($input_nb, "")
For $i = 1 to $nbObj
If $item = $stock[$i][0] Then GuiCtrlSetData($input_nb, $stock[$i][1])
Next
ElseIf $a[4] = $btn_ok Then
If $item <> -1 Then
$qte_stock_init = IniRead($stockini, "stock_init", $item, "")
$qte_diff = GuiCtrlRead($input_nb) - $qte_stock_init
$var = IniReadSectionNames($stockini)
For $i = 1 To $var[0]
If $var[$i] <> "prix" Then
$qte_init = IniRead($stockini, $var[$i], $item, "")
IniWrite($stockini, $var[$i], $item, $qte_init + $qte_diff)
EndIf
Next
For $i = 1 to $nbObj
If ControlListView($gui, "", $listview, "GetText", $i-1, 0) = $item Then
$qte_lv = ControlListView($gui, "", $listview, "GetText", $i-1, 1)
GUICtrlSetData($lignetab1[$i-1], "|" & $qte_lv + $qte_diff )
EndIf
Next
EndIf
EndIf
EndSwitch
WEnd
Case $Datedebut
$date1_reg = _DateLong2Short(GUICtrlRead($Datedebut)) ; format en
$now = _DateStandardToCalcDate(_NowDate())
If _DateDiff('d', $now, $date1_reg) < 0 Then
$date1_reg = $now
GuiCtrlSetData($Datedebut, $date1_reg)
EndIf
If _jours_de_loc() < 0 Then GuiCtrlSetData($Dateretour, $date1_reg)
_Actu_Tab1($Rev1) ;$date1_reg)
Case $Dateretour
$date1_reg = _DateLong2Short(GUICtrlRead($Datedebut)) ; format en
If _jours_de_loc() < 0 Then GuiCtrlSetData($Dateretour, $date1_reg)
Case $btn_ajout
$nb = InputBox("Question", "combien d'articles voulez vous ajouter ?")
If $nb Then
$prix_total = GuiCtrlRead($total)
$index = ControlListView ($gui, "", $listview, "GetSelected")
$produit = ControlListView ($gui, "", $listview, "GetText", $index, 0)
$prix = ControlListView ($gui, "", $listview, "GetText", $index, 2)
$prix = $nb*$prix
$newitem = $produit & "| | | " & $nb & "|" & StringFormat("%.2f", $prix)
GUICtrlCreateListViewItem($newitem, $listview1)
GuiCtrlSetData($total, StringFormat("%.2f", $prix_total + $prix))
$en_stock = ControlListView ($gui, "", $listview, "GetText", $index, 1)
$en_stock = $en_stock - $nb
GuiCtrlSetData($lignetab1[$index], "|" & $en_stock)
EndIf
Case $menuSuppr
$index = ControlListView($gui, "", $listview1, "GetSelected")
$sel_prix = ControlListView($gui, "", $listview1, "GetText", $index, 4)
$prix_total = GuiCtrlRead($total)
GuiCtrlSetData($total, StringFormat("%.2f", $prix_total - $sel_prix))
GuiCtrlDelete(GuiCtrlRead($listview1))
Case $btn_reg
If ControlListView($gui, "", $listview1, "GetItemCount") = 0 Then
Msgbox(4096+64, "Attention", "La liste est vide")
ElseIf GuiCtrlRead($Inputnom) = "" Then
Msgbox(4096+64, "Attention", "Entrer un nom pour la location")
Else
$Calc = _jours_de_loc()
If _Verif_loc() Then
; _devis_ini ()
_Stock_ini_actu()
EndIf
EndIf
EndSwitch
WEnd
;==============================================
Func GetItemClicked($hListView )
$aInfo = _GUICtrlListView_SubItemHitTest( $hlistView )
If $aInfo[0] = -1 Or $aInfo[1] = -1 Then Return SetError(2, 0, -1)
If IsArray($aInfo) = 0 Then Return SetError(1, 0, -1)
Return _GUICtrlListView_GetItemText($hlistView, $aInfo[0], $aInfo[1])
EndFunc
Func _BuildIni()
Local $array[3][3]
$array[0][0] = "assiette 18x18" ; objet
$array[0][1] = "20" ; quantité
$array[0][2] = "7.50" ; prix
$array[1][0] = "verres a vin"
$array[1][1] = "40"
$array[1][2] = "12"
$array[2][0] = "couteaux"
$array[2][1] = "50"
$array[2][2] = "17"
For $i = 0 to 2
IniWrite($stockini, "prix", $array[$i][0], $array[$i][2])
IniWrite($stockini, "stock_init", $array[$i][0], $array[$i][1])
IniWrite($stockini, _NowDate(), $array[$i][0], $array[$i][1])
Next
EndFunc
Func _StockDispo($var_date)
Local $n = 1, $var_date_disp, $var_stockdisp
Do
$n -= 1
$var_date_disp = _CalcDateToDateStandard(_DateAdd('d', $n, _DateStandardToCalcDate($var_date)))
$var_stockdisp = IniReadSection($stockini, $var_date_disp)
Until not @error
IniReadSection($stockini, $var_date)
If @error Then IniWriteSection($stockini, $var_date, $var_stockdisp)
Return $var_stockdisp
EndFunc
Func _Actu_Tab1($var_date)
Local $now = _DateStandardToCalcDate(_NowDate())
Local $diff = _DateDiff('d', $now, $var_date)
If $diff > 0 Then
$Data_old = IniReadSection($stockini, _NowDate())
For $i = 1 to $diff
$date_section_suiv = _CalcDateToDateStandard(_DateAdd('d', $i, $now))
$Data = IniReadSection($stockini, $date_section_suiv)
If @error Then
IniWriteSection($stockini, $date_section_suiv, $Data_old)
Else
$Data_old = $Data
EndIf
Next
For $i = 1 to $nbObj
GUICtrlSetData($lignetab1[$i-1], "|" & $Data_old[$i][1] )
Next
EndIf
EndFunc
Func _Verif_loc()
$count = ControlListView($gui, "", $listview1, "GetItemCount")
For $i = 0 To $count-1
$produit = ControlListView($gui, "", $listview1, "GetText", $i, 0)
$qte_comm = ControlListView($gui, "", $listview1, "GetText", $i, 3)
For $j = 0 to $Calc
$date_section = _CalcDateToDateStandard(_DateAdd('d', $j, $Rev1))
$qte_produit_dispo = IniRead($stockini, $date_section, $produit, $qte_comm)
$qte_diff = Int($qte_comm) - Int($qte_produit_dispo)
If $qte_diff > 0 Then
$warning = "Le " & $date_section & " le produit " & $produit & " sera indisponible, manque " & $qte_diff
Msgbox(4096+64, "Attention", $warning)
Return 0
EndIf
Next
Next
Return 1
EndFunc
Func _devis_ini()
$client = GUICtrlRead($Inputnom)
$inifile = @ScriptDir&"\"&"devis_" & $client & ".ini"
If FileExists($inifile) Then FileDelete($inifile)
$count = ControlListView($gui, "", $listview1, "GetItemCount")
IniWrite($inifile, $client, "debut", GUICtrlRead($Datedebut))
IniWrite($inifile, $client, "retour", GUICtrlRead($Dateretour))
For $i = 0 To $count-1
$ini_produit = ControlListView($gui, "", $listview1, "GetText", $i, 0)
$ini_qte = ControlListView($gui, "", $listview1, "GetText", $i, 3)
$ini_prix = ControlListView($gui, "", $listview1, "GetText", $i, 4)
IniWrite($inifile, $client, $ini_qte & " " & $ini_produit, $ini_prix )
Next
IniWrite($inifile, $client, "total par jour", GUICtrlRead($total))
IniWrite($inifile, $client, "total pour " & $Calc & " jours", StringFormat("%.2f", GUICtrlRead($total)*$Calc))
EndFunc
Func _Stock_ini_actu()
; Local $date_section, $date_section_prec, $Data_old
For $i = 0 to $Calc ;<<< $i = 0 on commence avec la 1ère date
$date_section = _CalcDateToDateStandard(_DateAdd('d', $i, $Rev1)) ; date
$Data_old = IniReadSection($stockini, $date_section) ; lit la section
If not @error Then ; si section existe
Local $count = _GUICtrlListView_GetItemCount($ListView1) ; compte lignes tab 2
For $k = 0 to $count - 1 ; pour chaque ligne du tableau 2
$aItem = _GUICtrlListView_GetItemTextArray($ListView1, $k) ; lit chaque ligne
For $j = 1 to $Data_old[0][0] ; pour chaque key de la section
If $Data_old[$j][0] = $aItem[1] Then ; si key = produit dans tab 2
$item = $Data_old[$j][1] ; IniRead($stockini, $date_section, $aItem[1], "0") ; $item = valeur de la key
IniWrite($stockini, $date_section, $aItem[1], $item - $aItem[4]) ; écrit key = valeur ini + valeur dans tab 2
EndIf
Next
Next
Else
$date_section_prec = _CalcDateToDateStandard(_DateAdd('d', -1, _DateStandardToCalcDate($date_section)))
$Data_old = IniReadSection($stockini, $date_section_prec) ; lit la section prec
IniWriteSection($stockini, $date_section, $Data_old) ; crée la section comme la précédente
EndIf
Next
EndFunc
Func _jours_de_loc() ; Nombre de jours entre les 2 dates
$Rev1 = _DateLong2Short(GUICtrlRead($Datedebut)) ; format YYYY/MM/DD
$Rev2 = _DateLong2Short(GUICtrlRead($Dateretour))
Return _DateDiff('d', $Rev1, $Rev2)
EndFunc
;===============================================================
Func _DateLong2Short($str, $lang = "en")
Local $aMonth[13] = ["", "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", _
"Août", "Septembre", "Octobre", "Novembre", "Décembre"]
Local $split = StringSplit($str, " ")
For $mois = 1 to 12
If $split[3] = $aMonth[$mois] Then Exitloop
Next
If $lang = "fr" Then
Return StringFormat("%02d/%02d/%04d", $split[2], $mois, $split[4])
Else
Return StringFormat("%04d/%02d/%02d", $split[4], $mois, $split[2])
EndIf
EndFunc
Func _CalcDateToDateStandard($sDate); yyyy/mm/dd => dd/mm/yyyy
If Not StringRegExp($sDate, "^\d{4}/\d{2}/\d{2}$") Then Return SetError(1, 0)
Local $ArrD = StringSplit($sDate, '/')
If $ArrD[0] <> 3 Then Return SetError(2, 0)
Return $ArrD[3] & '/' & $ArrD[2] & '/' & $ArrD[1]
EndFunc ;==>_DateStandardToCalcDate
Func _DateStandardToCalcDate($sDate); dd/mm/yyyy => yyyy/mm/dd
If Not StringRegExp($sDate, "^\d{2}/\d{2}/\d{4}$") Then Return SetError(1, 0)
Local $ArrD = StringSplit($sDate, '/')
If $ArrD[0] <> 3 Then Return SetError(2, 0)
Return $ArrD[3] & '/' & $ArrD[2] & '/' & $ArrD[1]
EndFunc ;==>_DateStandardToCalcDate