1"use strict"; 2(self["webpackChunkapp"] = self["webpackChunkapp"] || []).push([["src_app_category-sales-report_category-sales-report_module_ts"],{ 3 4/***/ 16790: 5/*!*******************************************************************************!*\ 6 !*** ./src/app/category-sales-report/category-sales-report-routing.module.ts ***! 7 \*******************************************************************************/ 8/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 9 10__webpack_require__.r(__webpack_exports__); 11/* harmony export */ __webpack_require__.d(__webpack_exports__, { 12/* harmony export */ "CategorySalesReportPageRoutingModule": () => (/* binding */ CategorySalesReportPageRoutingModule) 13/* harmony export */ }); 14/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tslib */ 39859); 15/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/core */ 14001); 16/* harmony import */ var _angular_router__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/router */ 13252); 17/* harmony import */ var _category_sales_report_page__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./category-sales-report.page */ 71452); 18 19 20 21 22const routes = [ 23 { 24 path: '', 25 component: _category_sales_report_page__WEBPACK_IMPORTED_MODULE_0__.CategorySalesReportPage 26 } 27]; 28let CategorySalesReportPageRoutingModule = class CategorySalesReportPageRoutingModule { 29}; 30CategorySalesReportPageRoutingModule = (0,tslib__WEBPACK_IMPORTED_MODULE_1__.__decorate)([ 31 (0,_angular_core__WEBPACK_IMPORTED_MODULE_2__.NgModule)({ 32 imports: [_angular_router__WEBPACK_IMPORTED_MODULE_3__.RouterModule.forChild(routes)], 33 exports: [_angular_router__WEBPACK_IMPORTED_MODULE_3__.RouterModule], 34 }) 35], CategorySalesReportPageRoutingModule); 36 37 38 39/***/ }), 40 41/***/ 72738: 42/*!***********************************************************************!*\ 43 !*** ./src/app/category-sales-report/category-sales-report.module.ts ***! 44 \***********************************************************************/ 45/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 46 47__webpack_require__.r(__webpack_exports__); 48/* harmony export */ __webpack_require__.d(__webpack_exports__, { 49/* harmony export */ "CategorySalesReportPageModule": () => (/* binding */ CategorySalesReportPageModule) 50/* harmony export */ }); 51/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tslib */ 39859); 52/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/core */ 14001); 53/* harmony import */ var _angular_common__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/common */ 28267); 54/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/forms */ 18346); 55/* harmony import */ var _ionic_angular__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @ionic/angular */ 78099); 56/* harmony import */ var _category_sales_report_routing_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./category-sales-report-routing.module */ 16790); 57/* harmony import */ var _category_sales_report_page__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./category-sales-report.page */ 71452); 58 59 60 61 62 63 64 65let CategorySalesReportPageModule = class CategorySalesReportPageModule { 66}; 67CategorySalesReportPageModule = (0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([ 68 (0,_angular_core__WEBPACK_IMPORTED_MODULE_3__.NgModule)({ 69 imports: [ 70 _angular_common__WEBPACK_IMPORTED_MODULE_4__.CommonModule, 71 _angular_forms__WEBPACK_IMPORTED_MODULE_5__.FormsModule, 72 _ionic_angular__WEBPACK_IMPORTED_MODULE_6__.IonicModule, 73 _category_sales_report_routing_module__WEBPACK_IMPORTED_MODULE_0__.CategorySalesReportPageRoutingModule 74 ], 75 declarations: [_category_sales_report_page__WEBPACK_IMPORTED_MODULE_1__.CategorySalesReportPage] 76 }) 77], CategorySalesReportPageModule); 78 79 80 81/***/ }), 82 83/***/ 71452: 84/*!*********************************************************************!*\ 85 !*** ./src/app/category-sales-report/category-sales-report.page.ts ***! 86 \*********************************************************************/ 87/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 88 89__webpack_require__.r(__webpack_exports__); 90/* harmony export */ __webpack_require__.d(__webpack_exports__, { 91/* harmony export */ "CategorySalesReportPage": () => (/* binding */ CategorySalesReportPage) 92/* harmony export */ }); 93/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tslib */ 39859); 94/* harmony import */ var _Users_achirinos_projects_gestionpos_app_PAQUETEBASE_app_code_node_modules_ngtools_webpack_src_loaders_direct_resource_js_category_sales_report_page_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !./node_modules/@ngtools/webpack/src/loaders/direct-resource.js!./category-sales-report.page.html */ 80258); 95/* harmony import */ var _category_sales_report_page_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./category-sales-report.page.scss */ 34822); 96/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/core */ 14001); 97/* harmony import */ var _service_server_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../service/server.service */ 67824); 98/* harmony import */ var _ionic_angular__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ionic/angular */ 78099); 99 100 101 102 103 104 105let CategorySalesReportPage = class CategorySalesReportPage { 106 constructor(server, loadingCtrl, toastCtrl) { 107 this.server = server; 108 this.loadingCtrl = loadingCtrl; 109 this.toastCtrl = toastCtrl; 110 this.startDate = ''; 111 this.endDate = ''; 112 this.data = []; 113 this.loading = false;
114 this.searched = false; 115 this.totalQuantity = 0; 116 this.totalSales = 0; 117 this.totalCost = 0; 118 this.totalProfit = 0; 119 const today = new Date(); 120 const firstDay = new Date(today.getFullYear(), today.getMonth(), 1); 121 this.endDate = today.toISOString(); 122 this.startDate = firstDay.toISOString(); 123 } 124 ngOnInit() { 125 this.loadReport(); 126 } 127 loadReport() { 128 return (0,tslib__WEBPACK_IMPORTED_MODULE_3__.__awaiter)(this, void 0, void 0, function* () { 129 if (!this.startDate || !this.endDate) { 130 this.presentToast('Seleccione el rango de fechas'); 131 return; 132 } 133 const loading = yield this.loadingCtrl.create({ message: 'Cargando reporte...', spinner: 'bubbles' }); 134 yield loading.present(); 135 try { 136 const params = { 137 start_date: this.startDate.split('T')[0], 138 end_date: this.endDate.split('T')[0] 139 }; 140 const response = yield this.server.getCategorySalesReport(params).toPromise(); 141 if (response.status === 'success') { 142 this.data = response.data || []; 143 this.calculateTotals(); 144 } 145 else { 146 this.presentToast(response.message || 'Error al cargar reporte'); 147 } 148 } 149 catch (e) { 150 this.presentToast('Error al cargar reporte'); 151 } 152 finally { 153 this.searched = true; 154 yield loading.dismiss(); 155 } 156 }); 157 } 158 calculateTotals() { 159 this.totalQuantity = this.data.reduce((s, i) => s + Number(i.quantity_sold), 0); 160 this.totalSales = this.data.reduce((s, i) => s + Number(i.total_sales), 0); 161 this.totalCost = this.data.reduce((s, i) => s + Number(i.total_cost), 0); 162 this.totalProfit = this.totalSales - this.totalCost; 163 } 164 getProfitColor(percentage) { 165 if (percentage >= 50) 166 return 'success'; 167 if (percentage >= 25) 168 return 'warning'; 169 return 'danger'; 170 } 171 presentToast(message) { 172 return (0,tslib__WEBPACK_IMPORTED_MODULE_3__.__awaiter)(this, void 0, void 0, function* () { 173 const toast = yield this.toastCtrl.create({ message, duration: 3000, position: 'bottom', mode: 'ios' }); 174 yield toast.present(); 175 }); 176 } 177}; 178CategorySalesReportPage.ctorParameters = () => [ 179 { type: _service_server_service__WEBPACK_IMPORTED_MODULE_2__.ServerService }, 180 { type: _ionic_angular__WEBPACK_IMPORTED_MODULE_4__.LoadingController }, 181 { type: _ionic_angular__WEBPACK_IMPORTED_MODULE_4__.ToastController } 182]; 183CategorySalesReportPage = (0,tslib__WEBPACK_IMPORTED_MODULE_3__.__decorate)([ 184 (0,_angular_core__WEBPACK_IMPORTED_MODULE_5__.Component)({ 185 selector: 'app-category-sales-report', 186 template: _Users_achirinos_projects_gestionpos_app_PAQUETEBASE_app_code_node_modules_ngtools_webpack_src_loaders_direct_resource_js_category_sales_report_page_html__WEBPACK_IMPORTED_MODULE_0__["default"], 187 styles: [_category_sales_report_page_scss__WEBPACK_IMPORTED_MODULE_1__] 188 }) 189], CategorySalesReportPage); 190 191 192 193/***/ }), 194 195/***/ 80258: 196/*!**************************************************************************************************************************************!*\ 197 !*** ./node_modules/@ngtools/webpack/src/loaders/direct-resource.js!./src/app/category-sales-report/category-sales-report.page.html ***! 198 \**************************************************************************************************************************************/ 199/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 200 201__webpack_require__.r(__webpack_exports__); 202/* harmony export */ __webpack_require__.d(__webpack_exports__, { 203/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 204/* harmony export */ }); 205/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("
205<ion-header class=\"ion-no-border\">\n <ion-toolbar color=\"light\">\n <ion-buttons slot=\"start\">\n <ion-back-button defaultHref=\"/reports\"></ion-back-button>\n </ion-buttons>\n <ion-title>Ventas por CategorÃas</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n\n <!-- Filtros -->\n <ion-card>\n <ion-card-content>\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col size=\"12\" size-md=\"5\">\n <ion-item lines=\"none\" mode=\"md\">\n <ion-label position=\"stacked\">Desde</ion-label>\n <ion-datetime-button datetime=\"startDate\"></ion-datetime-button>\n <ion-modal [keepContentsMounted]=\"true\">\n <ng-template>\n <ion-datetime id=\"startDate\" presentation=\"date\" [(ngModel)]=\"startDate\"></ion-datetime>\n </ng-template>\n </ion-modal>\n </ion-item>\n </ion-col>\n <ion-col size=\"12\" size-md=\"5\">\n <ion-item lines=\"none\" mode=\"md\">\n <ion-label position=\"stacked\">Hasta</ion-label>\n <ion-datetime-button datetime=\"endDate\"></ion-datetime-button>\n <ion-modal [keepContentsMounted]=\"true\">\n <ng-template>\n <ion-datetime id=\"endDate\" presentation=\"date\" [(ngModel)]=\"endDate\"></ion-datetime>\n </ng-template>\n </ion-modal>\n </ion-item>\n </ion-col>\n <ion-col size=\"12\" size-md=\"2\" class=\"ion-align-self-end\">\n <ion-button expand=\"block\" mode=\"ios\" (click)=\"loadReport()\">\n <ion-icon slot=\"start\" name=\"search-outline\"></ion-icon>\n Buscar\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n\n <!-- Resumen -->\n <ion-grid *ngIf=\"searched && data.length > 0\" class=\"summary-grid\">\n <ion-row>\n <ion-col size=\"6\" size-md=\"3\">\n <ion-card class=\"summary-card\"><ion-card-content>\n <p class=\"summary-label\">Unidades</p><h2>{{ totalQuantity | number:'1.0-2' }}</h2>\n </ion-card-content></ion-card>\n </ion-col>\n <ion-col size=\"6\" size-md=\"3\">\n <ion-card class=\"summary-card\"><ion-card-content>\n <p class=\"summary-label\">Ingreso</p><h2>{{ totalSales | currency }}</h2>\n </ion-card-content></ion-card>\n </ion-col>\n <ion-col size=\"6\" size-md=\"3\">\n <ion-card class=\"summary-card\"><ion-card-content>\n <p class=\"summary-label\">Costo</p><h2>{{ totalCost | currency }}</h2>\n </ion-card-content></ion-card>\n </ion-col>\n <ion-col size=\"6\" size-md=\"3\">\n <ion-card class=\"summary-card\"><ion-card-content>\n <p class=\"summary-label\">Utilidad</p><h2>{{ totalProfit | currency }}</h2>\n </ion-card-content></ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Sin resultados -->\n <div *ngIf=\"searched && !loading && data.length === 0\" class=\"empty-state\">\n <ion-icon name=\"pie-chart-outline\"></ion-icon>\n <p>No hay ventas en el perÃodo seleccionado.</p>\n </div>\n\n <!-- Lista por categorÃa -->\n <ion-card *ngIf=\"data.length > 0\">\n <ion-card-content>\n <ion-item *ngFor=\"let c of data\" lines=\"full\" class=\"cat-row\">\n <ion-label class=\"ion-text-wrap\">\n <h2>{{ c.category_name }}</h2>\n <p>{{ c.quantity_sold | number:'1.0-2' }} unidades · {{ c.products_count }} producto(s)</p>\n <p class=\"mini\">Ingreso {{ c.total_sales | currency }} · Costo {{ c.total_cost | currency }} · Utilidad {{ c.profit_margin | currency }}</p>\n </ion-label>\n <ion-badge slot=\"end\" [color]=\"getProfitColor(c.profit_percentage)\">{{ c.profit_percentage | number:'1.0-2' }}%</ion-badge>\n </ion-item>\n </ion-card-content>\n </ion-card>\n\n</ion-content>\n"); 206 207/***/ }), 208 209/***/ 34822: 210/*!***********************************************************************!*\ 211 !*** ./src/app/category-sales-report/category-sales-report.page.scss ***! 212 \***********************************************************************/ 213/***/ ((module) => { 214 215module.exports = "ion-content {\n --background: #f4f5f8;\n}\n\n.summary-grid .summary-card {\n margin: 4px;\n border-radius: 12px;\n}\n\n.summary-grid .summary-card .summary-label {\n margin: 0;\n font-size: 12px;\n color: var(--ion-color-medium);\n}\n\n.summary-grid .summary-card h2 {\n margin: 4px 0 0 0;\n font-size: 18px;\n font-weight: 700;\n}\n\n.cat-row h2 {\n font-weight: 700;\n font-size: 15px;\n}\n\n.cat-row p {\n font-size: 12px;\n}\n\n.cat-row .mini {\n color: var(--ion-color-medium);\n}\n\n.empty-state {\n text-align: center;\n padding: 48px 24px;\n color: var(--ion-color-medium);\n}\n\n.empty-state ion-icon {\n font-size: 56px;\n color: #adb5bd;\n}\n\n.empty-state p {\n margin-top: 12px;\n font-size: 14px;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNhdGVnb3J5LXNhbGVzLXJlcG9ydC5wYWdlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSxxQkFBQTtBQUNGOztBQUdFO0VBQ0UsV0FBQTtFQUNBLG1CQUFBO0FBQUo7O0FBRUk7RUFBaUIsU0FBQTtFQUFXLGVBQUE7RUFBaUIsOEJBQUE7QUFHakQ7O0FBRkk7RUFBSyxpQkFBQTtFQUFtQixlQUFBO0VBQWlCLGdCQUFBO0FBTzdDOztBQUZFO0VBQUssZ0JBQUE7RUFBa0IsZUFBQTtBQU96Qjs7QUFORTtFQUFJLGVBQUE7QUFTTjs7QUFSRTtFQUFRLDhCQUFBO0FBV1Y7O0FBUkE7RUFDRSxrQkFBQTtFQUNBLGtCQUFBO0VBQ0EsOEJBQUE7QUFXRjs7QUFURTtFQUFXLGVBQUE7RUFBaUIsY0FBQTtBQWE5Qjs7QUFaRTtFQUFJLGdCQUFBO0VBQWtCLGVBQUE7QUFnQnhCIiwiZmlsZSI6ImNhdGVnb3J5LXNhbGVzLXJlcG9ydC5wYWdlLnNjc3MiLCJzb3VyY2VzQ29udGVudCI6WyJpb24tY29udGVudCB7XG4gIC0tYmFja2dyb3VuZDogI2Y0ZjVmODtcbn1cblxuLnN1bW1hcnktZ3JpZCB7XG4gIC5zdW1tYXJ5LWNhcmQge1xuICAgIG1hcmdpbjogNHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG5cbiAgICAuc3VtbWFyeS1sYWJlbCB7IG1hcmdpbjogMDsgZm9udC1zaXplOiAxMnB4OyBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7IH1cbiAgICBoMiB7IG1hcmdpbjogNHB4IDAgMCAwOyBmb250LXNpemU6IDE4cHg7IGZvbnQtd2VpZ2h0OiA3MDA7IH1cbiAgfVxufVxuXG4uY2F0LXJvdyB7XG4gIGgyIHsgZm9udC13ZWlnaHQ6IDcwMDsgZm9udC1zaXplOiAxNXB4OyB9XG4gIHAgeyBmb250LXNpemU6IDEycHg7IH1cbiAgLm1pbmkgeyBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7IH1cbn1cblxuLmVtcHR5LXN0YXRlIHt
215cbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBwYWRkaW5nOiA0OHB4IDI0cHg7XG4gIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtKTtcblxuICBpb24taWNvbiB7IGZvbnQtc2l6ZTogNTZweDsgY29sb3I6ICNhZGI1YmQ7IH1cbiAgcCB7IG1hcmdpbi10b3A6IDEycHg7IGZvbnQtc2l6ZTogMTRweDsgfVxufVxuIl19 */"; 216 217/***/ }) 218 219}]); 220//# sourceMappingURL=src_app_category-sales-report_category-sales-report_module_ts.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.