PageSourceSearch

https://gestionposmobile.web.app/src_app_category-sales-report_category-sales-report_module_ts.js

js gestionposmobile.web.app collected 2026-10-03 12:26:14 UTC 16,769 bytes, 220 lines download raw bytes

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.