-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
330 lines (313 loc) · 54.4 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="mobile-web-app-capable" content="yes">
<title>
Documentación AutoStocker
</title>
<link rel="icon" type="image/png" href="https://raw.githubusercontent.com/IgnacioPrados/AutoStocker/master/favicon.png">
<link rel="apple-touch-icon" href="https://hackmd.io/apple-touch-icon.png">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha256-916EbMg70RQy9LHiGkXzG8hSg9EdNy97GazNG/aiY1w=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css" integrity="sha256-3iu9jgsy9TpTwXKb7bNQzqWekRX7pPK+2OLj3R922fo=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/octicons/3.5.0/octicons.min.css" integrity="sha256-QiWfLIsCT02Sdwkogf6YMiQlj4NE84MKkzEMkZnMGdg=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.5.1/themes/prism.min.css" integrity="sha256-vtR0hSWRc3Tb26iuN2oZHt3KRUomwTufNIf5/4oeCyg=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@hackmd/emojify.js@2.1.0/dist/css/basic/emojify.min.css" integrity="sha256-UOrvMOsSDSrW6szVLe8ZDZezBxh5IoIfgTwdNDgTjiU=" crossorigin="anonymous" />
<style>
@import url(https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,500,500i|Source+Code+Pro:300,400,500|Source+Sans+Pro:300,300i,400,400i,600,600i|Source+Serif+Pro&subset=latin-ext);.hljs{display:block;background:#fff;padding:.5em;color:#333;overflow-x:auto}.hljs-comment,.hljs-meta{color:#969896}.hljs-emphasis,.hljs-quote,.hljs-string,.hljs-strong,.hljs-template-variable,.hljs-variable{color:#df5000}.hljs-keyword,.hljs-selector-tag,.hljs-type{color:#a71d5d}.hljs-attribute,.hljs-bullet,.hljs-literal,.hljs-number,.hljs-symbol{color:#0086b3}.hljs-built_in,.hljs-builtin-name{color:#005cc5}.hljs-name,.hljs-section{color:#63a35c}.hljs-tag{color:#333}.hljs-attr,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-title{color:#795da3}.hljs-addition{color:#55a532;background-color:#eaffea}.hljs-deletion{color:#bd2c00;background-color:#ffecec}.hljs-link{text-decoration:underline}.markdown-body{font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body:after,.markdown-body:before{display:table;content:""}.markdown-body:after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#c00}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-top:0;margin-bottom:16px}.markdown-body hr{height:.25em;padding:0;margin:24px 0;background-color:#e7e7e7;border:0}.markdown-body blockquote{font-size:16px;padding:0 1em;color:#777;border-left:.25em solid #ddd}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd,.popover kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:1px solid #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown-body .loweralpha{list-style-type:lower-alpha}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#000;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{font-size:inherit}.markdown-body h1{font-size:2em}.markdown-body h1,.markdown-body h2{padding-bottom:.3em;border-bottom:1px solid #eee}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{font-size:.85em;color:#777}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol.no-list,.markdown-body ul.no-list{padding:0;list-style-type:none}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{padding-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}.markdown-body table th{font-weight:700}.markdown-body table td,.markdown-body table th{padding:6px 13px;border:1px solid #ddd}.markdown-body table tr{background-color:#fff;border-top:1px solid #ccc}.markdown-body table tr:nth-child(2n){background-color:#f8f8f8}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown-body code:after,.markdown-body code:before,.markdown-body tt:after,.markdown-body tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body pre code:after,.markdown-body pre code:before,.markdown-body pre tt:after,.markdown-body pre tt:before{content:normal}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-line-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.news .alert .markdown-body blockquote{padding:0 0 0 40px;border:0 none}.activity-tab .news .alert .commits,.activity-tab .news .markdown-body blockquote{padding-left:0}.task-list-item{list-style-type:none}.task-list-item label{font-weight:400}.task-list-item.enabled label{cursor:pointer}.task-list-item+.task-list-item{margin-top:3px}.task-list-item-checkbox{float:left;margin:.31em 0 .2em -1.3em!important;vertical-align:middle;cursor:default!important}.markdown-body{padding-top:40px;padding-bottom:40px;max-width:758px;overflow:visible!important;position:relative}.markdown-body .emoji{vertical-align:top}.markdown-body pre{border:inherit!important}.markdown-body code{color:inherit!important}.markdown-body pre code .wrapper{display:-moz-inline-flex;display:-ms-inline-flex;display:-o-inline-flex;display:inline-flex}.markdown-body pre code .gutter{float:left;overflow:hidden;-webkit-user-select:none;user-select:none}.markdown-body pre code .gutter.linenumber{text-align:right;position:relative;display:inline-block;cursor:default;z-index:4;padding:0 8px 0 0;min-width:20px;box-sizing:content-box;color:#afafaf!important;border-right:3px solid #6ce26c!important}.markdown-body pre code .gutter.linenumber>span:before{content:attr(data-linenumber)}.markdown-body pre code .code{float:left;margin:0 0 0 16px}.markdown-body .gist .line-numbers{border-left:none;border-top:none;border-bottom:none}.markdown-body .gist .line-data{border:none}.markdown-body .gist table{border-spacing:0;border-collapse:inherit!important}.markdown-body code[data-gist-id]{background:none;padding:0}.markdown-body code[data-gist-id]:after,.markdown-body code[data-gist-id]:before{content:""}.markdown-body code[data-gist-id] .blob-num{border:unset}.markdown-body code[data-gist-id] table{overflow:unset;margin-bottom:unset}.markdown-body code[data-gist-id] table tr{background:unset}.markdown-body[dir=rtl] pre{direction:ltr}.markdown-body[dir=rtl] code{direction:ltr;unicode-bidi:embed}.markdown-body .alert>p{margin-bottom:0}.markdown-body pre.abc,.markdown-body pre.flow-chart,.markdown-body pre.graphviz,.markdown-body pre.mermaid,.markdown-body pre.sequence-diagram,.markdown-body pre.vega{text-align:center;background-color:inherit;border-radius:0;white-space:inherit;overflow:visible}.markdown-body pre.abc>code,.markdown-body pre.flow-chart>code,.markdown-body pre.graphviz>code,.markdown-body pre.mermaid>code,.markdown-body pre.sequence-diagram>code,.markdown-body pre.vega>code{text-align:left}.markdown-body pre.abc>svg,.markdown-body pre.flow-chart>svg,.markdown-body pre.graphviz>svg,.markdown-body pre.mermaid>svg,.markdown-body pre.sequence-diagram>svg,.markdown-body pre.vega>svg{max-width:100%;height:100%}.markdown-body pre>code.wrap{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}.markdown-body .alert>p,.markdown-body .alert>ul{margin-bottom:0}.markdown-body summary{display:list-item}.markdown-body summary:focus{outline:none}.markdown-body details summary{cursor:pointer}.markdown-body details:not([open])>:not(summary){display:none}.markdown-body figure{margin:1em 40px}.markdown-body .mark,.markdown-body mark{background-color:#fff1a7}.vimeo,.youtube{cursor:pointer;display:table;text-align:center;background-position:50%;background-repeat:no-repeat;background-size:contain;background-color:#000;overflow:hidden}.vimeo,.youtube{position:relative;width:100%}.youtube{padding-bottom:56.25%}.vimeo img{width:100%;object-fit:contain;z-index:0}.youtube img{object-fit:cover;z-index:0}.vimeo iframe,.youtube iframe,.youtube img{width:100%;height:100%;position:absolute;top:0;left:0}.vimeo iframe,.youtube iframe{vertical-align:middle;z-index:1}.vimeo .icon,.youtube .icon{position:absolute;height:auto;width:auto;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;opacity:.3;transition:opacity .2s;z-index:0}.vimeo:hover .icon,.youtube:hover .icon{opacity:.6;transition:opacity .2s}.slideshare .inner,.speakerdeck .inner{position:relative;width:100%}.slideshare .inner iframe,.speakerdeck .inner iframe{position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%}.figma{display:table;position:relative;width:100%;padding-bottom:56.25%}.figma iframe{position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;border:1px solid #eee}.MJX_Assistive_MathML{display:none}#MathJax_Message{z-index:1000!important}.ui-infobar{position:relative;z-index:2;max-width:760px;margin:25px auto -25px;color:#777}.toc .invisable-node{list-style-type:none}.ui-toc{position:fixed;bottom:20px;z-index:998}.ui-toc.both-mode{margin-left:8px}.ui-toc.both-mode .ui-toc-label{height:40px;padding:10px 4px;border-top-left-radius:0;border-bottom-left-radius:0}.ui-toc-label{background-color:#e6e6e6;border:none;color:#868686;transition:opacity .2s}.ui-toc .open .ui-toc-label{opacity:1;color:#fff;transition:opacity .2s}.ui-toc-label:focus{opacity:.3;background-color:#ccc;color:#000}.ui-toc-label:hover{opacity:1;background-color:#ccc;transition:opacity .2s}.ui-toc-dropdown{margin-top:20px;margin-bottom:20px;padding-left:10px;padding-right:10px;max-width:45vw;width:25vw;max-height:70vh;overflow:auto;text-align:inherit}.ui-toc-dropdown>.toc{max-height:calc(70vh - 100px);overflow:auto}.ui-toc-dropdown[dir=rtl] .nav{padding-right:0;letter-spacing:.0029em}.ui-toc-dropdown a{overflow:hidden;text-overflow:ellipsis;white-space:pre}.ui-toc-dropdown .nav>li>a{display:block;padding:4px 20px;font-size:13px;font-weight:500;color:#767676}.ui-toc-dropdown .nav>li:first-child:last-child>ul,.ui-toc-dropdown .toc.expand ul{display:block}.ui-toc-dropdown .nav>li>a:focus,.ui-toc-dropdown .nav>li>a:hover{padding-left:19px;color:#000;text-decoration:none;background-color:transparent;border-left:1px solid #000}.ui-toc-dropdown[dir=rtl] .nav>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav>li>a:hover{padding-right:19px;border-left:none;border-right:1px solid #000}.ui-toc-dropdown .nav>.active:focus>a,.ui-toc-dropdown .nav>.active:hover>a,.ui-toc-dropdown .nav>.active>a{padding-left:18px;font-weight:700;color:#000;background-color:transparent;border-left:2px solid #000}.ui-toc-dropdown[dir=rtl] .nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav>.active>a{padding-right:18px;border-left:none;border-right:2px solid #000}.ui-toc-dropdown .nav .nav{display:none;padding-bottom:10px}.ui-toc-dropdown .nav>.active>ul{display:block}.ui-toc-dropdown .nav .nav>li>a{padding-top:1px;padding-bottom:1px;padding-left:30px;font-size:12px;font-weight:400}.ui-toc-dropdown[dir=rtl] .nav .nav>li>a{padding-right:30px}.ui-toc-dropdown .nav .nav>li>ul>li>a{padding-top:1px;padding-bottom:1px;padding-left:40px;font-size:12px;font-weight:400}.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a{padding-right:40px}.ui-toc-dropdown .nav .nav>li>a:focus,.ui-toc-dropdown .nav .nav>li>a:hover{padding-left:29px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav .nav>li>a:hover{padding-right:29px}.ui-toc-dropdown .nav .nav>li>ul>li>a:focus,.ui-toc-dropdown .nav .nav>li>ul>li>a:hover{padding-left:39px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a:hover{padding-right:39px}.ui-toc-dropdown .nav .nav>.active:focus>a,.ui-toc-dropdown .nav .nav>.active:hover>a,.ui-toc-dropdown .nav .nav>.active>a{padding-left:28px;font-weight:500}.ui-toc-dropdown[dir=rtl] .nav .nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>a{padding-right:28px}.ui-toc-dropdown .nav .nav>.active>.nav>.active:focus>a,.ui-toc-dropdown .nav .nav>.active>.nav>.active:hover>a,.ui-toc-dropdown .nav .nav>.active>.nav>.active>a{padding-left:38px;font-weight:500}.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active>a{padding-right:38px}.markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,sans-serif}html[lang^=ja] .markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,Hiragino Kaku Gothic Pro,ヒラギノ角ゴ Pro W3,Osaka,Meiryo,メイリオ,MS Gothic,MS\ ゴシック,sans-serif}html[lang=zh-tw] .markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,PingFang TC,Microsoft JhengHei,微軟正黑,sans-serif}html[lang=zh-cn] .markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,PingFang SC,Microsoft YaHei,微软雅黑,sans-serif}html .markdown-body[lang^=ja]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,Hiragino Kaku Gothic Pro,ヒラギノ角ゴ Pro W3,Osaka,Meiryo,メイリオ,MS Gothic,MS\ ゴシック,sans-serif}html .markdown-body[lang=zh-tw]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,PingFang TC,Microsoft JhengHei,微軟正黑,sans-serif}html .markdown-body[lang=zh-cn]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Helvetica,Roboto,Arial,PingFang SC,Microsoft YaHei,微软雅黑,sans-serif}html[lang^=ja] .ui-toc-dropdown{font-family:Source Sans Pro,Helvetica,Arial,Meiryo UI,MS PGothic,MS\ Pゴシック,sans-serif}html[lang=zh-tw] .ui-toc-dropdown{font-family:Source Sans Pro,Helvetica,Arial,Microsoft JhengHei UI,微軟正黑UI,sans-serif}html[lang=zh-cn] .ui-toc-dropdown{font-family:Source Sans Pro,Helvetica,Arial,Microsoft YaHei UI,微软雅黑UI,sans-serif}html .ui-toc-dropdown[lang^=ja]{font-family:Source Sans Pro,Helvetica,Arial,Meiryo UI,MS PGothic,MS\ Pゴシック,sans-serif}html .ui-toc-dropdown[lang=zh-tw]{font-family:Source Sans Pro,Helvetica,Arial,Microsoft JhengHei UI,微軟正黑UI,sans-serif}html .ui-toc-dropdown[lang=zh-cn]{font-family:Source Sans Pro,Helvetica,Arial,Microsoft YaHei UI,微软雅黑UI,sans-serif}.ui-affix-toc{position:fixed;top:0;max-width:15vw;max-height:70vh;overflow:auto}.back-to-top,.expand-toggle,.go-to-bottom{display:block;padding:4px 10px;margin-top:10px;margin-left:10px;font-size:12px;font-weight:500;color:#999}.back-to-top:focus,.back-to-top:hover,.expand-toggle:focus,.expand-toggle:hover,.go-to-bottom:focus,.go-to-bottom:hover{color:#563d7c;text-decoration:none}.back-to-top,.go-to-bottom{margin-top:0}.ui-user-icon{width:20px;height:20px;display:block;border-radius:50%;margin-top:2px;margin-bottom:2px;margin-right:5px;background-position:50%;background-repeat:no-repeat;background-size:cover}.ui-user-icon.small{width:18px;height:18px;display:inline-block;vertical-align:middle;margin:0 0 .2em}.ui-infobar>small>span{line-height:22px}.ui-infobar>small .dropdown{display:inline-block}.ui-infobar>small .dropdown a:focus,.ui-infobar>small .dropdown a:hover{text-decoration:none}.ui-more-info{color:#888;cursor:pointer;vertical-align:middle}.ui-more-info .fa{font-size:16px}.ui-connectedGithub,.ui-published-note{color:#888}.ui-connectedGithub{line-height:23px;white-space:nowrap}.ui-connectedGithub a.file-path{color:#888;text-decoration:none;padding-left:22px}.ui-connectedGithub a.file-path:active,.ui-connectedGithub a.file-path:hover{color:#888;text-decoration:underline}.ui-connectedGithub .fa{font-size:20px}.ui-published-note .fa{font-size:20px;vertical-align:top}.unselectable{-webkit-user-select:none;-o-user-select:none;user-select:none}.selectable{-webkit-user-select:text;-o-user-select:text;user-select:text}@media print{blockquote,div,img,pre,table{page-break-inside:avoid!important}a[href]:after{font-size:12px!important}}.markdown-body.slides{position:relative;z-index:1;color:#222}.markdown-body.slides:before{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1;background-color:currentColor;box-shadow:0 0 0 50vw}.markdown-body.slides section[data-markdown]{position:relative;margin-bottom:1.5em;background-color:#fff;text-align:center}.markdown-body.slides section[data-markdown] code{text-align:left}.markdown-body.slides section[data-markdown]:before{content:"";display:block;padding-bottom:56.23%}.markdown-body.slides section[data-markdown]>div:first-child{position:absolute;top:50%;left:1em;right:1em;transform:translateY(-50%);max-height:100%;overflow:hidden}.markdown-body.slides section[data-markdown]>ul{display:inline-block}.markdown-body.slides>section>section+section:after{content:"";position:absolute;top:-1.5em;right:1em;height:1.5em;border:3px solid #777}.site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,sans-serif}html[lang^=ja] .site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,Hiragino Kaku Gothic Pro,ヒラギノ角ゴ Pro W3,Osaka,Meiryo,メイリオ,MS Gothic,MS\ ゴシック,sans-serif}html[lang=zh-tw] .site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,PingFang TC,Microsoft JhengHei,微軟正黑,sans-serif}html[lang=zh-cn] .site-ui-font{font-family:Source Sans Pro,Helvetica,Arial,PingFang SC,Microsoft YaHei,微软雅黑,sans-serif}body{font-smoothing:subpixel-antialiased!important;-webkit-font-smoothing:subpixel-antialiased!important;-moz-osx-font-smoothing:auto!important;text-shadow:0 0 1em transparent,1px 1px 1.2px rgba(0,0,0,.004);-webkit-overflow-scrolling:touch;letter-spacing:.025em;font-family:Source Sans Pro,Helvetica,Arial,sans-serif}html[lang^=ja] body{font-family:Source Sans Pro,Helvetica,Arial,Hiragino Kaku Gothic Pro,ヒラギノ角ゴ Pro W3,Osaka,Meiryo,メイリオ,MS Gothic,MS\ ゴシック,sans-serif}html[lang=zh-tw] body{font-family:Source Sans Pro,Helvetica,Arial,PingFang TC,Microsoft JhengHei,微軟正黑,sans-serif}html[lang=zh-cn] body{font-family:Source Sans Pro,Helvetica,Arial,PingFang SC,Microsoft YaHei,微软雅黑,sans-serif}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}abbr[data-original-title],abbr[title]{cursor:help}body.modal-open{overflow-y:auto;padding-right:0!important}
</style>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js" integrity="sha256-3Jy/GbSLrg0o9y5Z5n1uw0qxZECH7C6OQpVBgNFYa0g=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js" integrity="sha256-g6iAfvZp+nDQ2TdTR/VVKJf3bGro4ub5fvWSWVRi2NE=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.9/es5-shim.min.js" integrity="sha256-8E4Is26QH0bD52WoQpcB+R/tcWQtpzlCojrybUd7Mxo=" crossorigin="anonymous"></script>
<![endif]-->
</head>
<body>
<div id="doc" class="markdown-body container-fluid comment-enabled" data-hard-breaks="true"><p><img src="https://raw.githubusercontent.com/IgnacioPrados/AutoStocker/master/banner.png" alt="banner" loading="lazy"></p><h1 id="Documentación-AutoStocker" data-id="Documentación-AutoStocker"><a class="anchor hidden-xs" href="#Documentación-AutoStocker" title="Documentación-AutoStocker"><span class="octicon octicon-link"></span></a><span>Documentación AutoStocker</span></h1><hr><h2 id="Developers" data-id="Developers"><a class="anchor hidden-xs" href="#Developers" title="Developers"><span class="octicon octicon-link"></span></a><span>Developers:</span></h2><ul>
<li><span>Ocampo Denise - </span><em><span>Chief information Officer</span></em><span> </span><img class="emoji" alt=":iphone:" src="https://cdn.jsdelivr.net/npm/@hackmd/emojify.js@2.1.0/dist/images/basic/iphone.png"></li>
<li><span>Endendyk Victoria - </span><em><span>Client-based</span></em><span> program tester 🛠️</span></li>
<li><span>Prados Ignacio - </span><em><span>Chief Technology Officer</span></em><span> </span><img class="emoji" alt=":computer:" src="https://cdn.jsdelivr.net/npm/@hackmd/emojify.js@2.1.0/dist/images/basic/computer.png"></li>
<li><span>Pedaccio Facundo - </span><em><span>Database Engineer and Technoking</span></em><span> </span><img class="emoji" alt=":rocket:" src="https://cdn.jsdelivr.net/npm/@hackmd/emojify.js@2.1.0/dist/images/basic/rocket.png"></li>
</ul><h2 id="Indice" data-id="Indice"><a class="anchor hidden-xs" href="#Indice" title="Indice"><span class="octicon octicon-link"></span></a><span>Indice:</span></h2><ol>
<li><span>Introducción</span></li>
<li><span>Librerías utilizadas</span></li>
<li><span>Interfaz de usuario</span></li>
<li><span>Estructura de almacenamiento de datos</span></li>
<li><span>Carga de datos</span></li>
<li><span>Estructura general del programa</span></li>
<li><span>Funciones</span></li>
</ol><hr><h3 id="1-Introduccion" data-id="1-Introduccion"><a class="anchor hidden-xs" href="#1-Introduccion" title="1-Introduccion"><span class="octicon octicon-link"></span></a><span>1. Introduccion:</span></h3><p><span>Autostocker es un programa basado en consola que utiliza una base de datos SQL. Este programa tiene una interfaz sencilla, rápida e intuitiva para el manejo de la información. Lo que buscamos es que el potencial cliente que decida adquirir este producto pueda tener un fácil manejo del sistema con funciones enfocadas a sus necesidades, y así obtener un crecimiento exponencial dentro de su empresa/negocio.</span></p><blockquote>
<p><a href="https://github.com/IgnacioPrados/AutoStocker" target="_blank" rel="noopener"><span>Ver Repositiorio en GitHub</span></a></p>
</blockquote><hr><h3 id="2-Librerias-utilizadas" data-id="2-Librerias-utilizadas"><a class="anchor hidden-xs" href="#2-Librerias-utilizadas" title="2-Librerias-utilizadas"><span class="octicon octicon-link"></span></a><span>2. Librerias utilizadas:</span></h3><h4 id="SQLite3" data-id="SQLite3"><a class="anchor hidden-xs" href="#SQLite3" title="SQLite3"><span class="octicon octicon-link"></span></a><span>SQLite3:</span></h4><p><a href="https://docs.python.org/es/3/library/sqlite3.html" target="_blank" rel="noopener"><span>Documentación oficial SQLite3</span></a></p><blockquote>
<p><span>SQL es un lenguaje de consulta estructurada, diseñado para manejar sistemas de bases de datos relacionales. SQL es muy popular por su facilidad de uso y efectividad para convertir grandes volúmenes de datos en información útil.</span></p>
</blockquote><blockquote>
<p><span>SQLite es una biblioteca de C que provee una base de datos ligera basada en disco que no requiere un proceso de servidor y permite acceder a la base de datos utilizando una variación del lenguaje de querys de SQL.</span></p>
</blockquote><blockquote>
<p><span>SQLite3 brinda una interfaz de SQLite dentro de Python. Nos permite conectarnos a una base de datos, ejecutar consultas (querys) con la sintaxis de SQLite. Esta librería no requiere instalación ya que es nativa de Python.</span></p>
</blockquote><h4 id="Pandas" data-id="Pandas"><a class="anchor hidden-xs" href="#Pandas" title="Pandas"><span class="octicon octicon-link"></span></a><span>Pandas:</span></h4><p><a href="https://pandas.pydata.org/docs/" target="_blank" rel="noopener"><span>Documentación oficial Pandas</span></a></p><blockquote>
<p><span>Es una biblioteca escrita como extensión de Numpy para manipulación y análisis de datos para el lenguaje de programación Python. Decidimos utilizarlo en nuestro código ya que podemos acceder al DataFrame, el cual es una estructura de datos con filas y columnas ordenadas.</span><br>
<span>En este programa fue utilizado para convertir las tablas almacenadas en nuestra base de datos a un objeto DataFrame de Pandas. Ese objeto DataFrame luego es convertido a una lista de listas de Python. También utilizamos DataFrame para mostrar las matrices de datos cuando el usuario lo requiera. Sera explicado en la sección </span><strong><em><span>carga de datos</span></em></strong><span>.</span></p>
</blockquote><h5 id="Instalación" data-id="Instalación"><a class="anchor hidden-xs" href="#Instalación" title="Instalación"><span class="octicon octicon-link"></span></a><span>Instalación:</span></h5><p><span>Pandas deberá ser instalado usando el siguiente comando en el símbolo del sistema (CMD).</span></p><pre><code>pip install numpy
</code></pre><p><span>Previamente instalando Numpy con el siguiente comando:</span></p><pre><code>pip install pandas
</code></pre><h4 id="Datetime" data-id="Datetime"><a class="anchor hidden-xs" href="#Datetime" title="Datetime"><span class="octicon octicon-link"></span></a><span>Datetime:</span></h4><p><a href="https://docs.python.org/es/3/library/datetime.html" target="_blank" rel="noopener"><span>Documentación oficial Datetime</span></a></p><blockquote>
<p><span>La librería datetime permite manipular fechas y horas. Es utilizado en este programa para obtener la fecha y hora en el momento que se ejecute algún cambio en la matriz de datos o para mostrar el horario en el menú principal. Explicaremos su funcionamiento en la sección de funciones. Esta librería no requiere instalación ya que es nativa de Python.</span></p>
</blockquote><h4 id="Os" data-id="Os"><a class="anchor hidden-xs" href="#Os" title="Os"><span class="octicon octicon-link"></span></a><span>Os:</span></h4><p><a href="https://docs.python.org/3/library/os.html" target="_blank" rel="noopener"><span>Documentación oficial OS</span></a></p><blockquote>
<p><span>Os es una librería nativa de Python que te permite interactuar con el sistema operativo. En este programa es utilizado para limpiar la terminal donde el usuario va haciendo pedidos y viendo data. De esta forma se logra una interfaz de usuario en consola más limpia.</span></p>
</blockquote><h4 id="Time" data-id="Time"><a class="anchor hidden-xs" href="#Time" title="Time"><span class="octicon octicon-link"></span></a><span>Time:</span></h4><p><a href="https://docs.python.org/es/3/library/time.html" target="_blank" rel="noopener"><span>Documentación oficial Time</span></a></p><blockquote>
<p><span>Time es un modulo que proporciona varias funciones relacionadas con el tiempo. La más utilizada en nuestro código es el método sleep(secs) que sirve para pausar la ejecución del hilo de llamada durante el número de segundos proporcionados en el argumento secs. Por lo tanto, necesitamos llamar al método time.sleep() para hacer que el programa se duerma durante un tiempo especifico.</span></p>
</blockquote><h4 id="Termcolor" data-id="Termcolor"><a class="anchor hidden-xs" href="#Termcolor" title="Termcolor"><span class="octicon octicon-link"></span></a><span>Termcolor:</span></h4><p><a href="https://pypi.org/project/termcolor/" target="_blank" rel="noopener"><span>Documentación oficial Termcolor</span></a></p><blockquote>
<p><span>Esta librería lo que nos permite hacer es cambiar el color del texto. Nosotros importamos colored de termcolor, esto es más que nada para la estética del programa, logrando destacar los números de nuestro programa principal.</span></p>
</blockquote><h5 id="Instalación1" data-id="Instalación"><a class="anchor hidden-xs" href="#Instalación1" title="Instalación1"><span class="octicon octicon-link"></span></a><span>Instalación:</span></h5><p><span>Termcolor deberá ser instalado usando el siguiente comando en el símbolo del sistema (CMD)</span></p><pre><code>pip install termcolor
</code></pre><hr><h3 id="3-Interfaz-de-usuario" data-id="3-Interfaz-de-usuario"><a class="anchor hidden-xs" href="#3-Interfaz-de-usuario" title="3-Interfaz-de-usuario"><span class="octicon octicon-link"></span></a><span>3. Interfaz de usuario:</span></h3><p><span>La interfaz de usuario que desarrollamos para este programa es una command line based UI. Es decir que es una interfaz en la terminal.</span></p><p><span>Elegimos este tipo de interfaz por su sencillez y rapidez. La interfaz es fácil de memorizar, y así agilizar el uso repetitivo en el día a día del usuario. También agregamos colores, mensajes que responden a lo que se está haciendo, y pequeños delays para que los movimientos dentro de la interfaz sean más suaves.</span></p><p><img src="https://i.imgur.com/NbnCy3B.png" alt="" loading="lazy"></p><hr><h3 id="4-Estructura-de-almacenamiento-de-datos" data-id="4-Estructura-de-almacenamiento-de-datos"><a class="anchor hidden-xs" href="#4-Estructura-de-almacenamiento-de-datos" title="4-Estructura-de-almacenamiento-de-datos"><span class="octicon octicon-link"></span></a><span>4. Estructura de almacenamiento de datos:</span></h3><p><span>Optamos por usar un modelo de base de datos relacional que cuenta con dos tablas (productos, registros)</span></p><h4 id="Matriz-de-Productos" data-id="Matriz-de-Productos"><a class="anchor hidden-xs" href="#Matriz-de-Productos" title="Matriz-de-Productos"><span class="octicon octicon-link"></span></a><span>Matriz de Productos:</span></h4><p><img src="https://i.imgur.com/MEa1glP.png" alt="" loading="lazy"></p><blockquote>
<p><span>Para AutoStocker decidimos registrar para cada producto el nombre, tipo de producto, número de stock, de reposición, última fecha de actualización de la carga del los datos y el precio de los productos.</span></p>
</blockquote><h4 id="Matriz-de-Registros" data-id="Matriz-de-Registros"><a class="anchor hidden-xs" href="#Matriz-de-Registros" title="Matriz-de-Registros"><span class="octicon octicon-link"></span></a><span>Matriz de Registros:</span></h4><p><img src="https://i.imgur.com/BYmj60w.png" alt="" loading="lazy"></p><blockquote>
<p><span>En la parte de registros, optamos por almacenar en cada uno de los ajustes el código del producto, la variación del stock, el motivo por el cual se realiza el cambio, y la fecha y hora de actualización (timestamp).</span></p>
</blockquote><hr><h3 id="5-Carga-y-guardado-de-datos" data-id="5-Carga-y-guardado-de-datos"><a class="anchor hidden-xs" href="#5-Carga-y-guardado-de-datos" title="5-Carga-y-guardado-de-datos"><span class="octicon octicon-link"></span></a><span>5. Carga y guardado de datos:</span></h3><p><span>En el programa la carga de datos se realiza desde el archivo de la base de datos (database.db) hacia el programa con el siguiente código:</span></p><pre><code class="py hljs"><span class="hljs-attr">conn</span> = sqlite3.connect(<span class="hljs-string">'./database.db'</span>)
<span class="hljs-attr">matrixpandas</span> = pandas.read_sql_query(<span class="hljs-string">"SELECT * FROM productos"</span>, conn)
<span class="hljs-attr">matriz</span> = matrixpandas.values.tolist()
<span class="hljs-attr">registros</span> = pandas.read_sql_query(<span class="hljs-string">"SELECT * FROM registros"</span>, conn)
<span class="hljs-attr">registros</span> = registros.values.tolist()
</code></pre><p><span>Es decir que utilizamos la librería sqlite3 para conectarnos a la base de datos, luego usamos pandas para ejecutar el pedido SQL (“SELECT * FROM productos”) con el método de pandas “pandas.read_sql_query” que convierte toda la matriz en un archivo DataFrame. Y por último convertimos ese DataFrame a una lista de listas de Python con el “matrixpandas.values.tolist()”.</span><br>
<span>Para guardar los datos desde el programa hacia la base de datos primero convertimos la matriz (lista de listas) en un objeto DataFrame de pandas. Y después utilizamos el método (“df.to_sql”) para guardar ese objeto DataFrame en la base de datos.</span></p><hr><h3 id="6-Estructura-general-del-programa" data-id="6-Estructura-general-del-programa"><a class="anchor hidden-xs" href="#6-Estructura-general-del-programa" title="6-Estructura-general-del-programa"><span class="octicon octicon-link"></span></a><span>6. Estructura general del programa:</span></h3><img src="https://raw.githubusercontent.com/IgnacioPrados/AutoStocker/master/Flowchart%20AutoStocker%20(1).png"><hr><h3 id="7-Funciones" data-id="7-Funciones"><a class="anchor hidden-xs" href="#7-Funciones" title="7-Funciones"><span class="octicon octicon-link"></span></a><span>7. Funciones:</span></h3><h4 id="Función-para-imprimir-la-matriz-de-productos" data-id="Función-para-imprimir-la-matriz-de-productos"><a class="anchor hidden-xs" href="#Función-para-imprimir-la-matriz-de-productos" title="Función-para-imprimir-la-matriz-de-productos"><span class="octicon octicon-link"></span></a><span>Función para imprimir la matriz de productos:</span></h4><blockquote>
<p><span>Esta función sirve para imprimir la matriz de los productos que decida incorporar el usuario dentro de la base de datos. La matriz es guardada e impresa como dataframe de pandas y el formato de impresión sera visto luego en el menú principal del programa al presionar la opción 1 que es la que permite imprimir la data completa.</span></p>
<blockquote>
<p><a href="https://github.com/IgnacioPrados/AutoStocker/blob/master/funciones/print_data.py" target="_blank" rel="noopener"><span>Ver código</span></a></p>
</blockquote>
</blockquote><h4 id="Función-para-imprimir-la-matriz-de-registros" data-id="Función-para-imprimir-la-matriz-de-registros"><a class="anchor hidden-xs" href="#Función-para-imprimir-la-matriz-de-registros" title="Función-para-imprimir-la-matriz-de-registros"><span class="octicon octicon-link"></span></a><span>Función para imprimir la matriz de registros:</span></h4><blockquote>
<p><span>Esta función sirve para imprimir la matriz de registros donde se podra visualizar los ajustes realizados dentro de la base de datos. Al igual que en la función para imprimir los productos, la matriz es impresa y guardada como un dataframe de pandas.</span></p>
<blockquote>
<p><a href="https://github.com/IgnacioPrados/AutoStocker/blob/master/funciones/print_registros.py" target="_blank" rel="noopener"><span>Ver código</span></a></p>
</blockquote>
</blockquote><h4 id="Función-para-consultar-el-stock-de-un-producto" data-id="Función-para-consultar-el-stock-de-un-producto"><a class="anchor hidden-xs" href="#Función-para-consultar-el-stock-de-un-producto" title="Función-para-consultar-el-stock-de-un-producto"><span class="octicon octicon-link"></span></a><span>Función para consultar el stock de un producto:</span></h4><blockquote>
<p><span>Esta función sirve para que el usuario pueda consultar el stock actual de un producto. La función se encarga de buscar el producto y determinar si se encontró o no dentro de la matriz. Si se encontró el código, imprime el stock del producto y vuelve al menú principal al presionar cualquier letra. Si no se encontró el código, devuelve un mensaje de error.</span></p>
<blockquote>
<p><a href="https://github.com/IgnacioPrados/AutoStocker/blob/master/funciones/product_stock.py" target="_blank" rel="noopener"><span>Ver código</span></a></p>
</blockquote>
</blockquote><h4 id="Función-para-filtrar-los-productos-por-tipo" data-id="Función-para-filtrar-los-productos-por-tipo"><a class="anchor hidden-xs" href="#Función-para-filtrar-los-productos-por-tipo" title="Función-para-filtrar-los-productos-por-tipo"><span class="octicon octicon-link"></span></a><span>Función para filtrar los productos por tipo:</span></h4><blockquote>
<p><span>Esta función sirve para filtrar los productos por categoría. La función se encarga de recorrer la matriz y comparar si el tipo de producto que aparece en cada fila es igual al tipo de producto capturado. Si es así, se crea una lista vacía en donde se van a ir agregando todos aquellos productos relacionados a la categoría que ingreso el usuario para luego imprimir la matriz en formato pandas mostrando los productos según como se quiera filtrar.</span></p>
<blockquote>
<p><a href="https://github.com/IgnacioPrados/AutoStocker/blob/master/funciones/product_type.py" target="_blank" rel="noopener"><span>Ver código</span></a></p>
</blockquote>
</blockquote><h4 id="Función-para-agregar-la-fecha-y-hora-de-ultima-actualizacion" data-id="Función-para-agregar-la-fecha-y-hora-de-ultima-actualizacion"><a class="anchor hidden-xs" href="#Función-para-agregar-la-fecha-y-hora-de-ultima-actualizacion" title="Función-para-agregar-la-fecha-y-hora-de-ultima-actualizacion"><span class="octicon octicon-link"></span></a><span>Función para agregar la fecha y hora de ultima actualizacion:</span></h4><blockquote>
<p><span>Esta función se encarga de, a partir de una función de la librería datetime, tomar el horario y fecha actual de la computadora y retornarla. Se la llama a esta función para visualizar la fecha y hora en la que se han hecho movimientos o cambios dentro de la matriz de productos o de registros.</span></p>
<blockquote>
<p><a href="https://github.com/IgnacioPrados/AutoStocker/blob/master/funciones/get_current_time.py" target="_blank" rel="noopener"><span>Ver código</span></a></p>
</blockquote>
</blockquote><h4 id="Función-para-agregar-un-nuevo-producto" data-id="Función-para-agregar-un-nuevo-producto"><a class="anchor hidden-xs" href="#Función-para-agregar-un-nuevo-producto" title="Función-para-agregar-un-nuevo-producto"><span class="octicon octicon-link"></span></a><span>Función para agregar un nuevo producto:</span></h4><blockquote>
<p><span>Esta función sirve para agregar un nuevo producto. La función crea una lista para almacenar los datos del nuevo producto agregando el nombre, tipo de producto, stock inicial, punto de reposición y el precio. Una vez que se tienen todos los datos del nuevo producto, con un append agregamos la lista a la matriz de la base de datos.</span></p>
<blockquote>
<p><a href="https://github.com/IgnacioPrados/AutoStocker/blob/master/funciones/add_new_product.py" target="_blank" rel="noopener"><span>Ver código</span></a></p>
</blockquote>
</blockquote><h4 id="Función-para-eliminar-producto" data-id="Función-para-eliminar-producto"><a class="anchor hidden-xs" href="#Función-para-eliminar-producto" title="Función-para-eliminar-producto"><span class="octicon octicon-link"></span></a><span>Función para eliminar producto:</span></h4><blockquote>
<p><span>Esta función se encarga de eliminar un producto a partir del código de producto que ingresa el usuario como input. La función con un index obtiene la posición del código que se desea eliminar, y si lo encuentra, lo elimina avisando con anterioridad que el código ha sido encontrado y se guarda la nueva matriz en la base de datos como un dataframe. Si no se encuentra el código, devuelve un mensaje de que el código no es correcto.</span></p>
<blockquote>
<p><a href="https://github.com/IgnacioPrados/AutoStocker/blob/master/funciones/delete_product.py" target="_blank" rel="noopener"><span>Ver código</span></a></p>
</blockquote>
</blockquote><h4 id="Función-para-editar-un-producto" data-id="Función-para-editar-un-producto"><a class="anchor hidden-xs" href="#Función-para-editar-un-producto" title="Función-para-editar-un-producto"><span class="octicon octicon-link"></span></a><span>Función para editar un producto:</span></h4><blockquote>
<p><span>Esta función se encarga de editar el producto que el usuario desee modificar. Una vez que el programa reconoce el código y lo compara con la matriz para ver si se encuentra, devuelve que el producto ha sido encontrado. Cuando finalmente se encuentra se puede modificar el nombre, precio, stock, código, categoría y punto de reposición. Si no se encuentra, la función devuelve que el código no se encontró y limpia la terminal.</span></p>
<blockquote>
<p><a href="https://github.com/IgnacioPrados/AutoStocker/blob/master/funciones/update_product.py" target="_blank" rel="noopener"><span>Ver código</span></a></p>
</blockquote>
</blockquote><h4 id="Función-para-modificar-el-stock-de-un-producto" data-id="Función-para-modificar-el-stock-de-un-producto"><a class="anchor hidden-xs" href="#Función-para-modificar-el-stock-de-un-producto" title="Función-para-modificar-el-stock-de-un-producto"><span class="octicon octicon-link"></span></a><span>Función para modificar el stock de un producto:</span></h4><blockquote>
<p><span>Esta función sirve para modificar el stock de un producto a partir del código del producto del usuario. Realiza comprobaciones de si el código existe. Esta función forma parte de la función para editar un producto.</span></p>
<blockquote>
<p><a href="https://github.com/IgnacioPrados/AutoStocker/blob/master/funciones/modificate_stock.py" target="_blank" rel="noopener"><span>Ver código</span></a></p>
</blockquote>
</blockquote><h4 id="Función-para-alertar-sobre-los-productos-a-reponer" data-id="Función-para-alertar-sobre-los-productos-a-reponer"><a class="anchor hidden-xs" href="#Función-para-alertar-sobre-los-productos-a-reponer" title="Función-para-alertar-sobre-los-productos-a-reponer"><span class="octicon octicon-link"></span></a><span>Función para alertar sobre los productos a reponer:</span></h4><blockquote>
<p><span>Esta función imprime los códigos y las filas donde el stock sea menor o igual al punto de reposición.</span></p>
<blockquote>
<p><a href="https://github.com/IgnacioPrados/AutoStocker/blob/master/funciones/alert.py" target="_blank" rel="noopener"><span>Ver código</span></a></p>
</blockquote>
</blockquote><footer style="text-align: center; margin-top: 60px; font-weight: 600;">
<div style="background-color: #614ad9; border-radius: 15px; padding-top: 10px;padding-bottom: 10px; box-shadow: 2px 2px 5px rgba(0,0,0,0.1)">
<p style="margin:0;color: #FFF !important">© 2021 | AutoStocker </p>
</div>
</footer></div>
<div class="ui-toc dropup unselectable hidden-print" style="display:none;">
<div class="pull-right dropdown">
<a id="tocLabel" class="ui-toc-label btn btn-default" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false" title="Table of content">
<i class="fa fa-bars"></i>
</a>
<ul id="ui-toc" class="ui-toc-dropdown dropdown-menu" aria-labelledby="tocLabel">
<div class="toc"><ul class="nav">
<li><a href="#Documentación-AutoStocker" title="Documentación AutoStocker">Documentación AutoStocker</a><ul class="nav">
<li><a href="#Developers" title="Developers:">Developers:</a></li>
<li><a href="#Indice" title="Indice:">Indice:</a><ul class="nav">
<li><a href="#1-Introduccion" title="1. Introduccion:">1. Introduccion:</a></li>
<li><a href="#2-Librerias-utilizadas" title="2. Librerias utilizadas:">2. Librerias utilizadas:</a></li>
<li><a href="#3-Interfaz-de-usuario" title="3. Interfaz de usuario:">3. Interfaz de usuario:</a></li>
<li><a href="#4-Estructura-de-almacenamiento-de-datos" title="4. Estructura de almacenamiento de datos:">4. Estructura de almacenamiento de datos:</a></li>
<li><a href="#5-Carga-y-guardado-de-datos" title="5. Carga y guardado de datos:">5. Carga y guardado de datos:</a></li>
<li><a href="#6-Estructura-general-del-programa" title="6. Estructura general del programa:">6. Estructura general del programa:</a></li>
<li><a href="#7-Funciones" title="7. Funciones:">7. Funciones:</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div><div class="toc-menu"><a class="expand-toggle" href="#">Expand all</a><a class="back-to-top" href="#">Back to top</a><a class="go-to-bottom" href="#">Go to bottom</a></div>
</ul>
</div>
</div>
<div id="ui-toc-affix" class="ui-affix-toc ui-toc-dropdown unselectable hidden-print" data-spy="affix" style="top:17px;display:none;" null null>
<div class="toc"><ul class="nav">
<li><a href="#Documentación-AutoStocker" title="Documentación AutoStocker">Documentación AutoStocker</a><ul class="nav">
<li><a href="#Developers" title="Developers:">Developers:</a></li>
<li><a href="#Indice" title="Indice:">Indice:</a><ul class="nav">
<li><a href="#1-Introduccion" title="1. Introduccion:">1. Introduccion:</a></li>
<li><a href="#2-Librerias-utilizadas" title="2. Librerias utilizadas:">2. Librerias utilizadas:</a></li>
<li><a href="#3-Interfaz-de-usuario" title="3. Interfaz de usuario:">3. Interfaz de usuario:</a></li>
<li><a href="#4-Estructura-de-almacenamiento-de-datos" title="4. Estructura de almacenamiento de datos:">4. Estructura de almacenamiento de datos:</a></li>
<li><a href="#5-Carga-y-guardado-de-datos" title="5. Carga y guardado de datos:">5. Carga y guardado de datos:</a></li>
<li><a href="#6-Estructura-general-del-programa" title="6. Estructura general del programa:">6. Estructura general del programa:</a></li>
<li><a href="#7-Funciones" title="7. Funciones:">7. Funciones:</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div><div class="toc-menu"><a class="expand-toggle" href="#">Expand all</a><a class="back-to-top" href="#">Back to top</a><a class="go-to-bottom" href="#">Go to bottom</a></div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha256-U5ZEeKfGNOja007MMD3YBI0A3OSZOQbeG6z2f2Y0hu8=" crossorigin="anonymous" defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.6.0/gist-embed.min.js" integrity="sha256-KyF2D6xPIJUW5sUDSs93vWyZm+1RzIpKCexxElmxl8g=" crossorigin="anonymous" defer></script>
<script>
var markdown = $(".markdown-body");
//smooth all hash trigger scrolling
function smoothHashScroll() {
var hashElements = $("a[href^='#']").toArray();
for (var i = 0; i < hashElements.length; i++) {
var element = hashElements[i];
var $element = $(element);
var hash = element.hash;
if (hash) {
$element.on('click', function (e) {
// store hash
var hash = this.hash;
if ($(hash).length <= 0) return;
// prevent default anchor click behavior
e.preventDefault();
// animate
$('body, html').stop(true, true).animate({
scrollTop: $(hash).offset().top
}, 100, "linear", function () {
// when done, add hash to url
// (default click behaviour)
window.location.hash = hash;
});
});
}
}
}
smoothHashScroll();
var toc = $('.ui-toc');
var tocAffix = $('.ui-affix-toc');
var tocDropdown = $('.ui-toc-dropdown');
//toc
tocDropdown.click(function (e) {
e.stopPropagation();
});
var enoughForAffixToc = true;
function generateScrollspy() {
$(document.body).scrollspy({
target: ''
});
$(document.body).scrollspy('refresh');
if (enoughForAffixToc) {
toc.hide();
tocAffix.show();
} else {
tocAffix.hide();
toc.show();
}
$(document.body).scroll();
}
function windowResize() {
//toc right
var paddingRight = parseFloat(markdown.css('padding-right'));
var right = ($(window).width() - (markdown.offset().left + markdown.outerWidth() - paddingRight));
toc.css('right', right + 'px');
//affix toc left
var newbool;
var rightMargin = (markdown.parent().outerWidth() - markdown.outerWidth()) / 2;
//for ipad or wider device
if (rightMargin >= 133) {
newbool = true;
var affixLeftMargin = (tocAffix.outerWidth() - tocAffix.width()) / 2;
var left = markdown.offset().left + markdown.outerWidth() - affixLeftMargin;
tocAffix.css('left', left + 'px');
} else {
newbool = false;
}
if (newbool != enoughForAffixToc) {
enoughForAffixToc = newbool;
generateScrollspy();
}
}
$(window).resize(function () {
windowResize();
});
$(document).ready(function () {
windowResize();
generateScrollspy();
});
//remove hash
function removeHash() {
window.location.hash = '';
}
var backtotop = $('.back-to-top');
var gotobottom = $('.go-to-bottom');
backtotop.click(function (e) {
e.preventDefault();
e.stopPropagation();
if (scrollToTop)
scrollToTop();
removeHash();
});
gotobottom.click(function (e) {
e.preventDefault();
e.stopPropagation();
if (scrollToBottom)
scrollToBottom();
removeHash();
});
var toggle = $('.expand-toggle');
var tocExpand = false;
checkExpandToggle();
toggle.click(function (e) {
e.preventDefault();
e.stopPropagation();
tocExpand = !tocExpand;
checkExpandToggle();
})
function checkExpandToggle () {
var toc = $('.ui-toc-dropdown .toc');
var toggle = $('.expand-toggle');
if (!tocExpand) {
toc.removeClass('expand');
toggle.text('Expand all');
} else {
toc.addClass('expand');
toggle.text('Collapse all');
}
}
function scrollToTop() {
$('body, html').stop(true, true).animate({
scrollTop: 0
}, 100, "linear");
}
function scrollToBottom() {
$('body, html').stop(true, true).animate({
scrollTop: $(document.body)[0].scrollHeight
}, 100, "linear");
}
</script>
</body>
</html>